2011-12-27 15 views
8
Şimdi bu kodu kullanıyorum

: (. Kullanıcı argümanlar herhangi bir sayı ile bir işlevle argc diyemezsin)Alma argüman sayısı

size_t argc(std::function<Foo()>) 
    { return 0; } 

    size_t argc(std::function<Foo(Bar)>) 
    { return 1; } 

    size_t argc(std::function<Foo(Bar, Bar)>) 
    { return 2; } 

    size_t argc(std::function<Foo(Bar, Bar, Bar)>) 
    { return 3; } 

    // ... 

Ama biraz çirkin ve sınırlı olduğu Bunu yapmanın daha iyi bir yolu var mı?

Not: dönüş tipi ve bağımsız değişken türü her zaman aynıdır. Şablonları herhangi bir türü kabul etmek için kullanabilirim, ama buna ihtiyacım yok.

+0

argüman türü umh –

+1

... hep aynı değildir JohannesSchaub-LITB @ ben hep aynıdır kastediyor Bu örnekler: Dönüş değeri için “Foo” ve tüm argümanlar için “Bar”. –

cevap

12

Temizleyici Paolo'nun cevap @ sürümü, kullanışlı:

template<class R, class... Args> 
constexpr unsigned arity(std::function<R(Args...)> const&){ 
    return sizeof...(Args); 
} 
5

şu herhangi Arity için çalışır ancak kabul edecek keyfi argüman türleri: Eğer gerçekten tip Foo(Bar, Bar, ...) işlevleri olmak için argüman türü sınırlamak istiyorsanız

template <typename T> 
struct arity 
{ 
}; 

template <typename... Args> 
struct arity<std::function<Foo(Args...)>> 
{ 
    static const int value = sizeof...(Args); 
}; 

, o zaman böyle bir şey yapabilirsiniz:

template <typename T> 
struct arity 
{ 
}; 

template <typename... Args> 
struct const_tuple 
{ 
}; 

template <> 
struct const_tuple<> 
{ 
    struct unsupported_function_type { }; 
}; 

template <typename... Args> 
struct const_tuple<Bar, Args...> 
{ 
    typedef typename const_tuple<Args...>::unsupported_function_type unsupported_function_type; 
}; 

template <typename... Args> 
struct arity<std::function<Foo(Args...)>> : public const_tuple<Args...>::unsupported_function_type 
{ 
    static const int value = sizeof...(Args); 
}; 

Desteklenmeyen bir işlev türüyle birlikte çağrıldığında bu bir derleme hatası verecektir. Gerçek nesnelerle

İlgili konular