2016-03-16 6 views
5

मैं इस तरह कोड कुछ है:एक टपल के प्रकार बात का अनुमान लगाना

template <typename T> 
inline typename ::std::enable_if< 
    is_std_tuple<T>{}, 
    T 
>::type 
get() 
{ 
    // pull tuple's elements from somewhere 
} 

आदेश मैं इस कास्टिंग किया टेम्पलेट प्रकार पैरामीटर टपल साथ instantiated था निकालना, करने के लिए:

static_cast<T*>(nullptr) 

और इस पारित एक फंक्शन

template <typename ...A> 
void deduce_tuple(::std::tuple<A...>* const); 

क्या मैं यूबी कर रहा हूं? क्या कोई बेहतर तरीका है?

+0

एक प्रकार के लिए एक शून्य सूचक को कास्टिंग करने में कुछ भी गलत नहीं है, जब तक कि आप इसे अस्वीकार नहीं करते। आप क्या करने की कोशिश कर रहे हैं? – Barry

+0

मुझे फ़ंक्शन में केवल 'ए ...' पैरामीटर पैक की आवश्यकता है और यह नहीं पता कि अन्यथा इसे कैसे प्राप्त किया जाए, अन्यथा सूचकांक चाल के अलावा और ':: std :: tuple_element <>' – user1095108

+0

चिपके रहने का एक लाभ 'tuple_size' और' tuple_element' यह है कि आपका कोड 'std :: pair' और 'std :: array' के साथ भी मुफ्त में काम करता है। –

उत्तर

5

यहां अपूर्णता यह है कि हम आंशिक रूप से फ़ंक्शन टेम्पलेट्स का विशेषज्ञ नहीं हो सकते हैं। आपका रास्ता ठीक है, क्योंकि हम शून्य सूचक को संदर्भित नहीं कर रहे हैं; मैं एक नामित टैग का उपयोग करना पसंद करूंगा:

template <typename...> struct deduction_tag {}; 

template <typename... Ts> 
std::tuple<Ts...> get(deduction_tag<std::tuple<Ts...>>) { 
    // […] 
} 
template <typename T> 
std::enable_if_t<is_std_tuple<T>{}, T> get() { 
    return get(deduction_tag<T>{}); 
} 
संबंधित मुद्दे