2016-09-09 12 views
5

मैं एक समारोह के लक्षण struct कि एक समारोह के तर्कों के प्रकार प्रदान करता है std::tuple_element का उपयोग कर:अगर सूचकांक सीमा से बाहर है तो std :: tuple_element से शून्य वापस कैसे करें?

#include <iostream> 
#include <tuple> 
#include <typeinfo> 

template <typename T> 
struct function_traits; 

template <typename T_Ret, typename ...T_Args> 
struct function_traits<T_Ret(T_Args...)> { 
    // Number of arguments. 
    enum { arity = sizeof...(T_Args) }; 
    // Argument types. 
    template <size_t i> 
    struct args { 
     using type 
      = typename std::tuple_element<i, std::tuple<T_Args...>>::type; 
    }; 
}; 

int main() { 
    using Arg0 = function_traits<int(float)>::args<0>::type; 
    //using Arg1 = function_traits<int(float)>::args<1>::type; // Error, should be void. 

    std::cout << typeid(Arg0).name() << std::endl; 
    //std::cout << typeid(Arg1).name() << std::endl; 
} 

Working example: Ideone

तो सूचकांक i रेंज (>= arity) से बाहर है, यह एक संकलन समय त्रुटि देता है । इसके बजाय, मुझे args<i>::typevoid के लिए i सीमा से बाहर करना होगा।

मैं विशिष्ट i के लिए args, इस तरह के i == arity के रूप में विशेषज्ञ कर सकते हैं, मैं सभी i >= arity के लिए args विशेषज्ञता के बारे में कैसे जा सकते हैं?

+0

आप हमारे लिए कोड का विस्तार कर सकते हैं। तो हम इसे संकलित कर सकते हैं? एक साधारण उपयोग मामले आदि की तरह। – Hayt

+0

@ हैट हो गया: http://ideone.com/qM9Jxp – zennehoy

उत्तर

4
std::conditional और अतिरिक्त अविवेक के साथ

:

struct void_type { using type = void; }; 


template <typename T_Ret, typename ...T_Args> 
struct function_traits<T_Ret(T_Args...)> { 
    // Number of arguments. 
    enum { arity = sizeof...(T_Args) }; 

    // Argument types. 
    template <size_t i> 
    struct args { 
     using type 
      = typename std::conditional<(i < sizeof...(T_Args)), 
             std::tuple_element<i, std::tuple<T_Args...>>, 
             void_type>::type::type; 
    }; 
}; 

Demo

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