在这段代码中,我希望
...
能够以一种简洁的方式表达“带有匹配参数的空函数”:
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++14 支持通用 lambda:
std::function<void(int foo, float bar)> somefunc = [](auto&&...) {};
somefunc(42, 4711.0f);
您可以定义一个空函数:
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);
}
(演示)