Bir dizini RandomAccessIterator döndüren başlangıç / bitiş ya da işleç [] tanımlanmış ve geçersiz türü olmayan bir değer döndürdüğü anlamına gelen dizinlenebilir bir kavram yazmak istiyorum.
Sıra kavramı için Stroustrup'un makalesindeki fikirleri kullandım ve aşağıdakilerle arttırdım:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
Çoğu durumda çalışır, ancak aşağıdakilerde başarısız olur:
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
Bazı nedenlerden dolayı benim konseptim, [] operatörünün özel olarak tanımlandığı ve true değerini döndürdüğü gerçeğini yoksayar. Neyi kaçırıyorum?
Herhangi bir pratik uygulaması olmayan akademik bir ödevdir.
—
magom001
Hangi derleyiciyi kullanıyorsunuz? İş ince için GCC gövde görünüyor godbolt.org/z/hY6UvY
—
sebrockm
static_assert
özel için geçer operator[]
ve kamu için başarısız oluyor.
concept bool
C ++ 20 kavramlarına değil, Concepts TS'ye karşı derlediğinizi belirtir. İkisi arasındaki kurallar farklı olabilir.
Indexable
pratikte kavramını? Tekdüze bir arabirimi garanti etmediği için, onu kullanan kodun yabegin(x)[i]
da varlığından statik olarak gönderilmesi gerekirx[i]
.