【发布时间】:2012-06-17 16:11:16
【问题描述】:
我想要一种从函数中生成函子的方法。现在我尝试通过 lambda 函数包装函数调用并稍后实例化它。但是编译器说 lambda 构造函数被删除了。 那么有没有办法编译这段代码呢?或者也许是另一种方式?
#include <iostream>
void func()
{
std::cout << "Hello";
}
auto t = []{ func(); };
typedef decltype(t) functor_type;
template <class F>
void functor_caller()
{
F f;
f();
}
int main()
{
functor_caller<functor_type>();
return 0;
}
现在我得到这样的编译器错误:
error: use of deleted function '<lambda()>::<lambda>()'
error: a lambda closure type has a deleted default constructor
我认为唯一的方法是使用宏:
#define WRAP_FUNC(f) \
struct f##_functor \
{ \
template <class... Args > \
auto operator()(Args ... args) ->decltype(f(args...)) \
{ \
return f(args...); \
} \
};
然后
WRAP_FUNC(func);
然后(主要)
functor_caller<func_functor>()
【问题讨论】:
-
我什至不能在
main中声明functor_type类型的变量。需要先让它发挥作用。 -
@user315052: 这其实是同一个问题。
-
你试过
F f(t);吗?目前,functor_caller不知道t。 -
没有。我不想用它。我尝试获取 lambda 类型,而不是默认构造它。
-
@Andigor:这没有意义。 lambda 类型没有默认值。编译器会告诉你很多(没有默认 ctor)。
标签: c++ lambda c++11 instantiation