मैं एक अवधारणा अनुक्रमणिका लिखना चाहता हूं जिसका अर्थ है कि एक अनुक्रम या तो शुरू / समाप्त हो गया है जो रैंडम एसेटइंटरेटर, या ऑपरेटर को लौटाता है [] परिभाषित है और गैर-शून्य प्रकार का मान लौटाता है।
मैंने अनुक्रम अवधारणा के लिए स्ट्रॉस्ट्रुप के लेख से विचारों का उपयोग किया और इसके साथ संवर्धित किया:
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
आप किस कंपाइलर का उपयोग कर रहे हैं? जीसीसी ट्रंक लगता है काम ठीक godbolt.org/z/hY6UvY
—
सेब्रुक
static_assert
निजी के लिए गुजरता है operator[]
और जनता के लिए विफल रहता है।
concept bool
इंगित करता है कि आप अवधारणाओं टीएस के खिलाफ संकलन कर रहे हैं, न कि सी ++ 20 अवधारणाएं। दोनों के बीच के नियम अलग हो सकते हैं।
Indexable
? चूंकि यह एक समान इंटरफ़ेस की गारंटी नहीं देता है, इसलिए कोड का उपयोग करके इसे अभी भीbegin(x)[i]
या तो अस्तित्व में लाने की आवश्यकता होगीx[i]
।