Voglio scrivere un concetto indicizzabile nel senso che una sequenza ha inizio / fine che restituiscono RandomAccessIterator o l'operatore [] è definito e restituisce un valore di tipo non vuoto.
Ho usato le idee dall'articolo di Stroustrup per il concetto di sequenza e l'ho aumentato con:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Funziona sulla maggior parte dei casi ma non riesce su quanto segue:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Per qualche ragione il mio concetto ignora il fatto che l'operatore [] è definito privato e restituisce vero. Cosa mi sto perdendo?
static_assert
passaggi per il privato operator[]
e il fallimento per il pubblico.
concept bool
indica che si sta eseguendo la compilazione in base ai concetti TS, non ai concetti C ++ 20. Le regole tra i due potrebbero essere diverse.
Indexable
concetto nella pratica? Dal momento che non garantisce un'interfaccia uniforme il codice che utilizza dovrebbe comunque inviare staticamente sull'esistenza di unobegin(x)[i]
ox[i]
.