C++ 指定std::函数的默认值 void func(const std::function&f=empty) { 如果(f) f(); }
“空”应该是什么?我使用C++ 指定std::函数的默认值 void func(const std::function&f=empty) { 如果(f) f(); },c++,lambda,C++,Lambda,“空”应该是什么?我使用[](){}。但从技术上讲,这不是空的,f()将执行。const std::function&f=nullptr void func(const std::function<void()>& f = empty) { if(f) f(); } 或 常量std::function&f=std::function() 您可以这样尝试: const std::function<void()>& f = std:
[](){}
。但从技术上讲,这不是空的,f()将执行。const std::function&f=nullptr
void func(const std::function<void()>& f = empty)
{
if(f)
f();
}
或
常量std::function&f=std::function()
您可以这样尝试:
const std::function<void()>& f = std::function<void()>()
常量std::function&f=std::function()
正如Basile所补充的,该标准规定:
§20.8.11.1类错误的函数调用[函数封装错误调用]
1/引发类型为bad_函数_调用的异常
当函数包装器对象
没有目标
void func(const std::function&f={}){
if(f)f();
}
对于空的案例,我会使用null ptr。可以使用它,因为您从不使用完整函数对象,而只使用指向它们的指针,所以
func(f1)实际上,code>将是func(&f1)
=>您将始终向func传递指针,因此nullptr
是最佳候选
这将编译并运行:
void func(const std::function<void()>& f = {}) {
if(f) f();
}
void func(const std::function&f=nullptr)
{
如果(f)
f();
}
使用默认函数的替代方法是:
void func(const std::function<void()>& f = nullptr)
{
if(f)
f();
}
void func(const std::function&f=std::function()){
试一试{
f();
}
catch(std::错误的函数调用e){
}
}
使用异常捕获。这两种情况之间的选择主要取决于您是否期望出现空情况;几乎从不:带异常去与有时:呼叫前测试
正如问题所提到的,如果(f)
,请使用nullptr
是,默认的std::function
会引发一些异常(我忘了是哪一个)…@BasileStarynkevitch,但OP的代码会在调用之前检查该函数是否为空。或者这不是你的意思吗?@BasileStarynkevitch:-寻找这个:1/当函数包装器对象没有目标时,function::operator()(20.8.11.2.4)抛出类型为bad\u function\u调用的异常。
?@suzuiyue你是什么意思?我没有看到bool cast或!操作员过载。那么,如果(f)或(f)f工作的话,为什么?SuuuiYo我现在刚进入STD:函数,但是我想是因为C++是用C++风格的函数指针创建的,在这里你检查FP是否为空,F是对lambda创建的未命名函数的函数指针。“如果我错了,有人可以在这里纠正我。@suzuiyue”
void func(const std::function<void()>& f = {}) {
if(f) f();
}
void func(const std::function<void()>& f = nullptr)
{
if(f)
f();
}
void func(const std::function<void()>& f = std::function<void()>()) {
try {
f();
}
catch(std::bad_function_call e) {
}
}