2016-11-14 11 views
11

std::tuple_size और std::tuple_element के विशिष्ट प्रकार के लिए अनुमति है? मुझे लगता है कि यह है, लेकिन मैं पूरी तरह से सुनिश्चित होना चाहता हूं, और मुझे कोई ठोस जानकारी नहीं मिल रही है।सी ++: क्या std :: tuple_size/tuple_element विशिष्ट हो सकता है?

उदाहरण (नामस्थान, सदस्य कार्य करता है और get<I> भार के छोड़े गए):

template <typename T, size_t N> 
struct vector { T _data[N]; }; 

template<size_t I, typename T, size_t N> 
constexpr T& get(vector<T,N>& vec) { return vec._data[I]; } 

namespace std { 
template<typename T, size_t N> 
class tuple_size< vector<T,N> > : public std::integral_constant<size_t, N> { }; 
template<size_t I, typename T, size_t N> 
class tuple_element< I, vector<T,N> > { public: using type = T; }; 
} 

मैं की जरूरत है कि संरचित बाइंडिंग साथ प्रयोग के लिए: उपयोगकर्ता परिभाषित प्रकार के लिए

void f(vector<T,3> const& vec) 
{ 
    auto& [x,y,z] = vec; 
    // stuff... 
} 

उत्तर

11

विशेषज्ञताएं आम तौर पर ठीक हैं, और हमेशा किया गया है N4606, [namespace.std]/1:

एक कार्यक्रम std नाम स्थान के लिए केवल तभी घोषणा उपयोगकर्ता-निर्धारित प्रकार पर निर्भर करता है और विशेषज्ञता मानक पुस्तकालय आवश्यकताओं को पूरा करती किसी भी मानक पुस्तकालय टेम्पलेट के लिए एक टेम्पलेट विशेषज्ञता जोड़ सकते हैं मूल टेम्पलेट के लिए और स्पष्ट रूप से निषिद्ध नहीं है।

tuple_size के लिए, मूल टेम्पलेट के लिए आवश्यकताओं/1 में [tuple.helper] निर्दिष्ट कर रहे हैं:

tuple_size<T> के सभी विशेषज्ञताओं कुछ N के लिए integral_constant<size_t, N> के BaseCharacteristic साथ UnaryTypeTrait आवश्यकताओं को पूरा करेगा।

UnaryTypeTrait, बारी में, [meta.rqmts]/1:

एक UnaryTypeTrait एक प्रकार की संपत्ति का वर्णन है। यह एक वर्ग टेम्पलेट होगा जो एक टेम्पलेट प्रकार तर्क लेता है और, वैकल्पिक रूप से, अतिरिक्त तर्क जो वर्णित संपत्ति को परिभाषित करने में मदद करते हैं। यह DefaultConstructible, CopyConstructible होगा, और सार्वजनिक रूप से और स्पष्ट रूप से ली गई, प्रत्यक्ष या परोक्ष, अपने BaseCharacteristic, जो टेम्पलेट integral_constant की एक विशेषज्ञता है से, टेम्पलेट integral_constant विशेष संपत्ति वर्णित किया जा रहा के लिए आवश्यकताओं द्वारा निर्धारित करने के लिए तर्क के साथ। बेस कैरेक्टरिस्टिक के सदस्य नाम छुपाए नहीं जाएंगे और यूनरी टाइप टाइप में अनजाने में उपलब्ध होंगे।

tuple_element की आवश्यकताओं [tuple.helper] में/6 और [meta.rqmts]/3, लेकिन संक्षिप्तता के हित में मैं उन्हें यहाँ पोस्ट नहीं होगा निर्दिष्ट हैं। यह कहना पर्याप्त है कि यह वास्तव में विशेषज्ञता के लिए कानूनी है ...

+1

ध्यान दें कि ऐसा करने के लिए नई 'ऑटो [ए, बी, सी] 'संरचित बाइंडिंग सुविधा का उपयोग करने के लिए सी ++ 1z में ऐसा करना आवश्यक है। – Yakk

संबंधित मुद्दे