让编译器为 std::function 生成一个空的默认函数

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

在这段代码中,我希望

...
能够以一种简洁的方式表达“带有匹配参数的空函数”:

std::function<void(int foo, float bar)> somefunc  = ...;

我希望它生成与此相对应的代码,但不重复参数类型:

std::function<void(int foo, float bar)> somefunc  = [](int, float) {};

背景

我可以这样声明并初始化

std::function

std::function<void(int foo, float bar)> somefunc;

然后我可以这样称呼它:

if(somefunc) {
    somefunc(42, 4711.0f);
}

但是 if 语句使代码变得臃肿(而且我不太喜欢空指针),因此我可以使用默认的空实现来定义该函数:

std::function<void(int foo, float bar)> somefunc  = [](int, float) {};

然后调用将很简单:

somefunc(42, 4711.0f);

但是重复这样的参数会有点重复,所以我想要一些能够生成空实现的东西。

c++
2个回答
6
投票

C++14 支持通用 lambda:

std::function<void(int foo, float bar)> somefunc  = [](auto&&...) {};
somefunc(42, 4711.0f);

5
投票

您可以定义一个空函数:

struct nullfunc_t
{
    template<class F>
    operator std::function<F>()
    { return [](auto&&...){}; }
} nullfunc;

现在,这变得合法并做正确的事(TM):

int main()
{
    std::function<void(int, float)> somefunc1 = nullfunc;
    std::function<void(float, int)> somefunc2 = nullfunc;
    somefunc1(1, 2.f);
    somefunc2(1.f, 2);
}

演示

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