如何在 C++ 中从 std::function 签名构造无操作回调?

问题描述 投票:0回答:3

我有一些回调定义,例如:

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.

我找到了这个答案-很好,但我不知道如何为我的目的改进它。

c++ templates lambda callback
3个回答
1
投票

不确定我是否理解问题。如果你想要一个什么都不做的

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);
}

1
投票

您可以像这样为

GetNoopCallback
-返回函数实现
void

template <class F>
F GetNoopCallback() {
    return [](auto&&...){};
}

然后:

void SetCallback(TSomeCallback = GetNoopCallback<TSomeCallback>());

1
投票

你可以这样做

void SetCallback(TSomeCallback = [](auto...){});

但我更推荐

void SetCallback(TSomeCallback = {})

并检查回调内部是否为非空。或者也许不提供默认参数,如果你不想被回调,就不要调用

SetCallback

© www.soinside.com 2019 - 2024. All rights reserved.