Code: Select all
template
struct foo {
void bar(Iterable& collection) {
for (const auto& item : collection) {
// ...
}
}
};
Code: Select all
template
Exposition-only-Ausdrücke /* begin-expr */ und /* end-expr */ sind wie folgt definiert:
- Wenn der Typ von /* range */ ist ein Verweis auf einen Array-Typ R:
Wenn R von ist gebunden N, /* begin-expr */ ist /* range */ und /* end-expr */ ist /* range */ + N. - Wenn R ein Array mit unbekannter Grenze oder ein Array mit unvollständigem Typ ist, ist das Programm falsch formatiert.
[*]Sonst /* begin-expr */ ist begin(/* range */) und /* end-expr */ ist end(/* range */), wobei begin und end über eine argumentabhängige Suche (nicht ADL-Suche) gefunden werden wird nicht ausgeführt).
Aus dieser Beschreibung kann ich möglicherweise etwas zusammenbrauen, indem ich is_array verwende für den ersten Fall und is_function oder is_invocable zu Suchen Sie nach passenden begin()- und end()-Funktionen für die anderen beiden Fälle. Aber ich befürchte, dass dies ein ziemliches Durcheinander wäre und sehr wahrscheinlich zu Eckfällen führen würde (Szenarien, die tatsächlich kompatibel sind, und umgekehrt, lehne ich ab).
Gibt es eine? einfacher oder bereits etablierter Weg?
C++20-Konzepte bieten hierfür eine viel schönere Lösung, aber ich suche nach einer C++17-Lösung, bei der type_traits das beste verfügbare Tool ist .