Je veux écrire un concept indexable signifiant qu'une séquence a un début / fin qui renvoie RandomAccessIterator, ou operator [] est défini et renvoie une valeur de type non void.
J'ai utilisé des idées de l'article de Stroustrup pour le concept Sequence et je l'ai complété avec:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Il fonctionne dans la plupart des cas mais échoue dans les cas suivants:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Pour une raison quelconque, mon concept ignore le fait que l'opérateur [] est défini comme privé et renvoie vrai. Qu'est-ce que je rate?
static_assert
passes pour le privé operator[]
et échouent pour le public.
concept bool
indique que vous compilez avec Concepts TS, et non avec les concepts C ++ 20. Les règles entre les deux pourraient être différentes.
Indexable
concept dans la pratique? Puisqu'il ne garantit pas une interface uniforme, le code qui l'utilise devrait quand même statistiquement distribuer l'existence debegin(x)[i]
oux[i]
.