2012-01-28 24 views

cevap

42

olmalıdır. Deney kodu

template<typename T> 
struct count_arg; 

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

:

typedef std::function<int(int, int)> fun; 
std::cout << count_arg<fun>::value << std::endl; //should print 2 

bu bakınız:

: Aynı şekilde Online demo


siz bu işe daha fazla özellik koyabilir, Ama bunu kendiniz uygulayabilir

template<typename T> 
struct function_traits;  //renamed it! 

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; 
    }; 
}; 

Şimdi sıra, const dizini kullanarak, her argüman türü alabilirsiniz:

std::cout << typeid(function_traits<fun>::arg<0>::type).name() << std::endl; 
std::cout << typeid(function_traits<fun>::arg<1>::type).name() << std::endl; 
std::cout << typeid(function_traits<fun>::arg<2>::type).name() << std::endl; 

Working demo

Bu tipteki parçalanmış-adını yazdıran!

+5

+1: O__O'yu çalıştıran değişken şablonlar elde ettikten sonra Vay bu işlem gerçekten basitleşir; – Klaim

+1

Güzel bir çözüm ... Bildiğim kadarıyla, 'sizeof ... (Args)' doğru bir sözdizimi! '' Bizeof() '' Args' için özel bir anlamı var mı? Çünkü genellikle '' sizeof() 'sadece veri tipinin büyüklüğü ile değil, elemanların sayısıyla ilgilidir. – iammilind

+4

@iammilind: 'sizeof ... (T)', 'T' parametre paketinin boyutunu elde etmek için özel bir sözdizimidir. “Bizeof (T)” ile ilgisi yoktur (§5.3.3/5, §14.5.3/7). – kennytm

İlgili konular