Ich möchte ein Konzept Indexable schreiben, das bedeutet, dass eine Sequenz entweder Anfang / Ende hat, die RandomAccessIterator zurückgibt, oder operator [] definiert ist und einen Wert vom Typ nicht void zurückgibt.
Ich habe Ideen aus Stroustrups Artikel für das Sequenzkonzept verwendet und es erweitert mit:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Es funktioniert in den meisten Fällen, schlägt jedoch in folgenden Fällen fehl:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Aus irgendeinem Grund ignoriert mein Konzept die Tatsache, dass operator [] privat definiert ist und true zurückgibt. Was vermisse ich?
static_assert
Pässe für privat operator[]
und scheitern für öffentlich.
concept bool
Gibt an, dass Sie mit den Konzepten TS kompilieren, nicht mit C ++ 20-Konzepten. Die Regeln zwischen den beiden können unterschiedlich sein.
Indexable
Konzept in der Praxis? Da dies keine einheitliche Schnittstelle garantiert, müsste der verwendete Code bei Vorhandensein von entwederbegin(x)[i]
oder noch statisch versendet werdenx[i]
.