ฉันต้องการเขียนแนวคิดที่สามารถจัดทำดัชนีความหมายว่าลำดับที่มีเริ่มต้น / สิ้นสุดที่ส่งกลับ RandomAccessIterator หรือผู้ประกอบการ [] ถูกกำหนดและส่งกลับค่าประเภทที่ไม่เป็นโมฆะ
ฉันใช้แนวคิดจากบทความของ Stroustrupสำหรับแนวคิด Sequence และเติมด้วย:
template <class T>
concept bool Indexable = Sequence<T> || requires(T t, size_t n) {
{ t[n] } -> NotVoid;
};
สามารถใช้งานได้ในกรณีส่วนใหญ่ แต่ล้มเหลวในกรณีต่อไปนี้
struct Bad {
std::vector<int> nums;
private:
int& operator[](size_t ind) {
return nums[ind];
}
};
static_assert(!Indexable<Bad>, "fail");
ด้วยเหตุผลบางอย่างที่คอนเซ็ปต์ของฉันเพิกเฉยต่อความจริงที่ว่าตัวดำเนินการ [] ถูกกำหนดเป็นส่วนตัวและให้ผลตอบแทนจริง ฉันกำลังคิดถึงอะไร
มันเป็นงานวิชาการที่ไม่มีการใช้งานจริง
—
magom001
ดูเหมือนว่าไม่ได้มีความตั้งใจ: "การตรวจสอบการเข้าใช้งานเป็นส่วนหนึ่งของกระบวนการทดแทน" eel.is/c++draft/temp#deduct-8.note-1
—
LF
คุณใช้คอมไพเลอร์อะไร? ลำตัว GCC ดูเหมือนจะทำงานได้ดีgodbolt.org/z/hY6UvYการ
—
sebrockm
static_assert
ส่งผ่านสำหรับส่วนตัวoperator[]
และล้มเหลวสำหรับสาธารณะ
concept bool
บ่งชี้ว่าคุณกำลังคอมไพล์กับ Concepts TS ไม่ใช่แนวคิด C ++ 20 กฎระหว่างทั้งสองอาจแตกต่างกัน
Indexable
แนวคิดของคุณในทางปฏิบัติอย่างไร เพราะมันไม่ได้รับประกันเครื่องแบบอินเตอร์เฟซโค้ดใช้มันยังคงต้องคงการจัดส่งในการดำรงอยู่ของทั้งสองหรือbegin(x)[i]
x[i]