2012-01-31 95 views
3

這是一個關於How do I get the argument types of a function pointer in a variadic template class?使用非const表達式作爲模板參數

跟進我有這樣的結構來訪問可變參數模板的參數:

template<typename T> 
struct function_traits; 

template<typename R, typename ...Args> 
struct function_traits<std::function<R(Args...)>> 
{ 
    static const size_t nargs = sizeof...(Args); 

    typedef R result_type; 

    template <size_t i> 
    struct arg 
    { 
     typedef typename std::tuple_element<i, std::tuple<Args...>>::type type; 
    }; 
}; 

我訪問一個參數的類型的參數

typedef function<void(Args...)> fun; 
std::cout << std::is_same<int, typename function_traits<fun>::template arg<0>::type>::value << std::endl; 

但是,我想迭代通過參數來處理任意數量的參數。以下不工作,而是想說明我想要的東西:

for (int i = 0; i < typename function_traits<fun>::nargs ; i++){ 
    std::cout << std::is_same<int, typename function_traits<fun>::template arg<i>::type>::value << std::endl; 
} 

回答

5

你需要沿着

template <typename fun, size_t i> struct print_helper { 
    static void print() { 
     print_helper<fun, i-1>::print(); 
     std::cout << std::is_same<int, typename function_traits<fun>::template arg<i-1>::type>::value << std::endl; 
    } 
}; 

template <typename fun> struct print_helper<fun,0> { 
    static void print() {} 
}; 

template <typename fun> void print() { 
    print_helper<fun, function_traits<fun>::nargs>::print(); 
} 
+0

線做一個編譯時迭代謝謝@Mike。我想,它必須是遞歸的,在編譯時,我只是沒有設法把它放在一起;)但是:'fun'在範圍中是未知的。我試圖將'fun'作爲模板參數傳遞,但是在專業化方面,編譯器會抱怨:'不允許使用'功能模板部分專用化''print <0, fun>'。我的專長是:'template void print <0,fun>(){}' – steffen 2012-01-31 10:36:55

+0

@steffen:不,您不能部分專門化函數模板,只能使用類模板。我想你需要將這些函數包裝在類中;我會更新答案。 – 2012-01-31 10:41:45

+0

美麗,完美的解決方案!謝謝! – steffen 2012-01-31 12:14:11

相關問題