我编写了一个traits类,它允许我在C++ 0x中提取有关函数或函数对象的参数和类型的信息(使用gcc 4.5.0测试).一般情况处理函数对象:
template <typename F>
struct function_traits {
template <typename R, typename... A>
struct _internal { };
template <typename R, typename... A>
struct _internal<R (F::*)(A...)> {
// ...
};
typedef typename _internal<decltype(&F::operator())>::<<nested types go here>>;
};
Run Code Online (Sandbox Code Playgroud)
然后我对全局范围内的普通函数进行了专门化:
template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
// ...
};
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以将一个函数传递给模板或函数对象,它可以正常工作:
template <typename F>
void foo(F f) {
typename function_traits<F>::whatever ...;
}
int f(int x) { ... }
foo(f);
Run Code Online (Sandbox Code Playgroud)
如果foo我不想传递一个函数或函数对象,而是想传递一个lambda表达式,该怎么办?
foo([](int x) { ... });
Run Code Online (Sandbox Code Playgroud)
这里的问题是既不function_traits<>适用专业化.C++ …