我有一些回调定义,例如:
using TSomeCallback = std::function<ReturnType(Type1, Type2, Type3, …)>;
我还有一些方法接受这个回调作为参数:
void SetCallback(TSomeCallback);
我只想定义一些模板,直接从 TSomeCallback 实例化无操作回调:
void SetCallback(TSomeCallback = GetNoopCallback<TSomeCallback>()); // or
void SetCallback(TSomeCallback = GetNoopCallback(TSomeCallback())); // or any other way.
我找到了这个答案-很好,但我不知道如何为我的目的改进它。
不确定我是否理解问题。如果你想要一个什么都不做的
std::function< ... >
,你可以使用lambda来构造它。如果返回类型是 void
那么这有效:
#include <functional>
#include <string>
using namespace std;
using TSomeCallback = std::function<void(int,double,int)>;
int main() {
TSomeCallback tc = [](auto...){};
tc(42,12.0,42);
}
您可以像这样为
GetNoopCallback
-返回函数实现void
:
template <class F>
F GetNoopCallback() {
return [](auto&&...){};
}
然后:
void SetCallback(TSomeCallback = GetNoopCallback<TSomeCallback>());
你可以这样做
void SetCallback(TSomeCallback = [](auto...){});
但我更推荐
void SetCallback(TSomeCallback = {})
并检查回调内部是否为非空。或者也许不提供默认参数,如果你不想被回调,就不要调用
SetCallback
!