如何檢測返回類型和空值和一元函數指針,std :: function對象以及函數(包括lambdas)的參數類型?檢測函數對象(仿函數)和lambda特徵
Boost的function_traits和functional traits並不完全讓我開箱,但我願意補充或替換它們。
我可以做這樣的事情:
namespace nsDetail
{
class Dummy { Dummy(); };
}
template<class Fn> struct FnTraits;
template<class R>
struct FnTraits<R(*)()>
{
typedef nsDetail::Dummy ParamType;
typedef R ReturnType;
typedef R Signature();
};
template<class R, class P>
struct FnTraits<R(*)(P)>
{
typedef P ParamType;
typedef R ReturnType;
typedef R Signature(P);
};
template<class R>
struct FnTraits< std::function<R()> >
{
typedef nsDetail::Dummy ParamType;
typedef R ReturnType;
typedef R Signature();
};
template<class R, class P>
struct FnTraits< std::function<R(P)> >
{
typedef P ParamType;
typedef R ReturnType;
typedef R Signature(P);
};
但我應該如何爲專門仿函數/ lambda表達式?
更新:也許類似this answer to a different question,但從重載翻譯到專業化?
在這個答案是什麼東西:http://stackoverflow.com/questions/4170201/c0x-overloading-on-lambda-arity/4196447#4196447它使用重載,但也許類似的東西可以用於專業化? – metal 2011-06-01 13:59:52
@mlimber我確實編輯了我的答案以反映 – 2011-06-01 14:05:57
謝謝! – metal 2011-06-01 14:08:05