मैं उचित सदस्य फ़ंक्शन का उपयोग कर जेनेरिक वेक्टर ऑब्जेक्ट को कॉल करने के लिए this answer की शैली में SFINAE का उपयोग कर रहा हूं। उदाहरण के लिए, निम्न कोड operator[](int) const
कॉल पहले, और अगर है कि तब operator()(int) const
मौजूद नहीं है: के रूप में this thread में सुझाव दियासी ++ एसएफआईएनएई केवल एक वर्ग टेम्पलेट पैरामीटर के साथ क्यों विफल रहता है?
template<int I> struct rank : rank<I-1> { static_assert(I > 0, ""); };
template<> struct rank<0> {};
template<typename VectorType>
struct VectorWrapper
{
auto get(int i) const
{
return get(v, i, rank<5>());
}
template<typename V, typename = std::enable_if_t<has_bracket_operator<const V>::value> >
auto get(V const& v, int i, rank<2>) const
{
return v[i];
}
template<typename V, typename = std::enable_if_t<has_parenthesis_operator<const V>::value> >
auto get(V const& v, int i, rank<1>) const
{
return v(i);
}
VectorType v;
};
has_bracket_operator
और
has_parenthesis_operator
लक्षण की स्थापना के साथ
, पूरे संकलित करता है तथा seems to work।
हालांकि, अधिभारित वर्ग टेम्पलेट्स में सदस्य वेक्टर को पास करने से पहले अनावश्यक लगता है, इसलिए मैंने इसे पास किए बिना इसे स्थापित करने का प्रयास किया। निम्न त्रुटि संदेश के साथ
template<typename = std::enable_if_t<has_bracket_operator<VectorType>::value> >
auto get(int i, rank<2>) const
{
return v[i];
}
template<typename = std::enable_if_t<has_parenthesis_operator<VectorType>::value> >
auto get(int i, rank<1>) const
{
return v(i);
}
हालांकि अब संकलन में विफल रहता है (जीसीसी 5.1.0 में): इस के लिए, मैं कक्षा टेम्पलेट स्थापित करने के लिए इस्तेमाल किया VectorType
पैरामीटर के साथ टेम्पलेट पैरामीटर V
प्रतिस्थापित
/usr/local/include/c++/5.1.0/type_traits: In substitution of 'template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = has_parenthesis_operator<std::vector<int> >::value; _Tp = void]':
main.cpp:46:10: required from 'struct VectorWrapper<std::vector<int> >'
main.cpp:59:38: required from here
/usr/local/include/c++/5.1.0/type_traits:2388:61: error: no type named 'type' in 'struct std::enable_if<false, void>'
using enable_if_t = typename enable_if<_Cond, _Tp>::type;
सवाल:
- इस संकलन त्रुटि का कारण क्या है?
- क्या मेरे पहले कोड ब्लॉक के अलावा कोई उचित कामकाज है? (यही वह है जो सामान्य कोडिंग शैली को बरकरार रखता है - जहां किसी को सदस्यों को पास नहीं करना पड़ता है)।
मुझे यकीन नहीं है कि "तत्काल संदर्भ" क्या प्रासंगिक है (हालांकि समाधान ध्वनि है)। यह [सीडब्ल्यूजी 1635] है (http://wg21.link/cwg1635)। –
@ टी.सी. क्या इसका मतलब है कि संकलन करना सही नहीं है लेकिन संभवतः नहीं होना चाहिए, या यह संकलित होना चाहिए और संकलक त्रुटियों में हैं? – Barry
मुझे नहीं पता कि सीडब्ल्यूजी उस मुद्दे के बारे में क्या करने जा रहा है। अभी मैं शायद इस underspecified कॉल करेंगे। –