我编写了一个特征类,可以让我提取有关 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);
如果foo
我不想将函数或函数对象传递给 ,而是传递一个 lambda 表达式怎么办?
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 表达式?