C++ 有没有办法缩短C++;11声明中的lambda签名?
我想缩短以下类型的lambda:C++ 有没有办法缩短C++;11声明中的lambda签名?,c++,c++11,lambda,syntactic-sugar,C++,C++11,Lambda,Syntactic Sugar,我想缩短以下类型的lambda: [] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {}; [](SomeVeryLongTemplateType,另一个longtype){}; 由于此lambda的唯一原因是初始化某个类std::function成员-它不捕获任何内容,没有参数名称,它不返回任何内容,也不执行任何操作 如果缩短操作表示为签名中参数数量的函数,那么我希望此函数
[] (SomeVeryLongTemplateType<int, float, char, std::string>, AnotherLongType) {};
[](SomeVeryLongTemplateType,另一个longtype){};
由于此lambda的唯一原因是初始化某个类std::function
成员-它不捕获任何内容,没有参数名称,它不返回任何内容,也不执行任何操作
如果缩短操作表示为签名中参数数量的函数,那么我希望此函数的复杂性为O(1)
有没有办法做到这一点?您正在寻找“多态lambda”。它们(还)不存在,所以不存在
但是,通过正确使用
typedef
s,您可以使它变得更容易,这样您就不必每次都键入整个内容。看起来您正在寻找一个空的lambda,它什么也不做,这样您的std::function
对象将始终处于可调用状态
如果是,则对任意数量的参数使用可重复使用的:
static const struct empty\u lambda\u t//static and const应用于对象!
{
模板
void操作符()(T&&…)const{}//不执行任何操作
}空的λ{}//声明一个静态的常量对象
然后将其用作:
std::function<void()> fun1 = empty_lambda;
std::function<void(int,int)> fun2 = empty_lambda;
std::function<void(whatever)> fun3 = empty_lambda;
std::function fun1=empty_lambda;
std::function fun2=空的λ;
std::fun3函数=空λ;
希望这能有所帮助。在C++14中,会有“泛型lambda”,据我所知,它可以简化参数中的长类型名称:
auto lambda = [](auto x, auto y) {return x + y; };
这里的auto
类似于模板类型
吹毛求疵:
无论什么
都必须是无效(无论什么)
。除了void
@B:是之外,它不能有返回类型。编辑。谢谢:-)这有什么用?你能给我举个例子说明这一点有用吗?我想我应该向OP询问这件事,但是如果你能的话,那就太好了。@bolov:用途是可以调用函数对象(fun1
)。另一方面,如果只声明这个:std::function fun
(没有任何初始化),然后执行fun(10)
将引发异常,因为fun
中没有可调用的内容。@bolov:我不知道“null/default initialization”是什么意思。正如我在回答中所说,它是空的可调用实体,不做任何事情。所以,若用它初始化std::函数,那个么函数对象将处于可调用状态,这意味着若调用它,将不会抛出异常。如果这就是您所说的“空/默认初始化”,那么是的!
auto lambda = [](auto x, auto y) {return x + y; };