Chcę napisać pojęcie Indeksowalne, co oznacza, że sekwencja ma początek / koniec, który zwraca RandomAccessIterator, lub operator [] jest zdefiniowany i zwraca wartość typu nieważnego.
Wykorzystałem pomysły z artykułu Stroustrupa dotyczące koncepcji Sekwencji i rozszerzyłem je o:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Działa w większości przypadków, ale nie działa w następujących przypadkach:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Z jakiegoś powodu moja koncepcja ignoruje fakt, że operator [] jest zdefiniowany jako prywatny i zwraca true. czego mi brakuje?
static_assert
Przechodzi na prywatny, operator[]
a nie publiczny.
concept bool
wskazuje, że kompilujesz w oparciu o TS Concepts, a nie C ++ 20. Zasady między nimi mogą być różne.
Indexable
koncepcję w praktyce? Ponieważ nie gwarantuje jednolitego interfejsu, kod, który go użyje, nadal musiałby statycznie wysyłać informacje o istnieniu jednegobegin(x)[i]
lubx[i]
.