我写了一个特性类(traits class),可以让我提取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>>;
};
然后我有一个专门用于全局作用域下普通函数的特化:
template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
// ...
};
这个很好用,我可以将一个函数传递到模板中或者一个函数对象,它可以正常工作:
template <typename F>
void foo(F f) {
typename function_traits<F>::whatever ...;
}
int f(int x) { ... }
foo(f);
如果我想传递一个lambda表达式而不是将函数或函数对象传递给foo
,该怎么办?
foo([](int x) { ... });
这里的问题在于function_traits<>
的任何一个特化都不适用。C++0x草案规定表达式的类型是“独特的、无名的、非联合类类型”。调用typeid(...).name()
返回的结果反解后,给出了似乎是gcc内部命名约定用于lambda表达式的字符串main::{lambda(int)#1}
,它并不能表示一个C++类型名称。简而言之,在这里我能放入什么东西到模板中呢?
template <typename R, typename... A>
struct function_traits<????> { ... }
如何让该特质类接受一个lambda表达式?