std::get
साथ अच्छा खेलने get`, SFINAE के अनुकूल होने के लिए प्रतीत नहीं होता है, जैसा कि निम्न परीक्षण का मामला द्वारा दिखाए गए:`बनाना std :: SFINAE
template <class T, class C>
auto foo(C &c) -> decltype(std::get<T>(c)) {
return std::get<T>(c);
}
template <class>
void foo(...) { }
int main() {
std::tuple<int> tuple{42};
foo<int>(tuple); // Works fine
foo<double>(tuple); // Crashes and burns
}
लक्ष्य हटाने की है दूसरी ओवरलोड की ओर foo
पर दूसरा कॉल। अभ्यास में, libstdC++ देता है:
/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../include/c++/6.3.0/tuple:1290:14: fatal error: no matching function for call to '__get_helper2'
{ return std::__get_helper2<_Tp>(__t); }
^~~~~~~~~~~~~~~~~~~~~~~
libC++ और अधिक प्रत्यक्ष है, एक सीधी static_assert
विस्फोट के साथ:
/usr/include/c++/v1/tuple:801:5: fatal error: static_assert failed "type not found in type list"
static_assert (value != -1, "type not found in type list");
^ ~~~~~~~~~~~
मैं वास्तव में प्याज की परतों देखना हो C
एक std::tuple
विशेषज्ञता है, और की तलाश में लागू करने के लिए नहीं की तरह होगा T
के लिए इसके पैरामीटर के अंदर ...
क्या std::get
का कोई कारण नहीं है SFINAE-friendly होने के लिए? क्या ऊपर उल्लिखित की तुलना में बेहतर कामकाज है?
मुझे something about std::tuple_element
मिला है, लेकिन std::get
नहीं मिला है।
"एस" "SFINAE" का हिस्सा "प्रतिस्थापन" के लिए खड़ा है । यहां, टेम्पलेट पैरामीटर को पहले 'foo' में प्रतिस्थापित करने में कोई समस्या नहीं थी। 'टी'' डबल' है। 'सी' वह टुपल प्रकार है। प्रतिस्थापन सफल हुआ! –
@SamVarshavchik लेकिन वापसी प्रकार में एक अवैध फ़ंक्शन कॉल बनाना शामिल है। जो प्रतिस्थापन विफलता को ट्रिगर करेगा, अगर 'std :: get' SFINAE- अनुकूल था (यानी अमान्य कॉल के लिए अधिभार सेट से बाहर निकलें)। इसलिए मेरा सवाल है। – Quentin
@ सैमवर्षवचिक [इस स्निपेट को देखें] (http://coliru.stacked-crooked.com/a/f22c57a5c4f2fb37) उदाहरण के लिए। – Quentin