#include <iostream>
#include <functional>
using MyFunctionAlias = std::function<void(int, double)>;
void exampleFunction(int value, double value2 = 3.14) {}
int main() {
MyFunctionAlias func = exampleFunction;
// OK
func(10, 2);
// ERROR
func(10);
return 0;
}
问题在于 std::function 对象的声明中不允许使用默认参数,因此必须使用默认参数来调用
func
。
在我的应用程序中,我使用
MyFunctionAlias
作为不同类中的成员变量,以便为各种情况提供通用类型。在某些类中,有某些可选参数。在这些情况下,我可以简单地为函数调用中的可选参数提供虚拟值,但理想情况下,我不想提供虚拟值,而是在没有默认参数的情况下调用函数,如上面所示。有没有办法使用函数指针来做到这一点?
这里有一个类似的问题,但我认为这个解决方案仅在绑定到相同的函数时才有效——我想将func
设置为不同的函数(
func = exampleFunction2
,
func = exampleFunction3
,...),具体取决于一些运行时输入。
std::function
那么你可以只使用 lambda
auto func = [](auto... vars){ return exampleFunction(vars...); }
如果您不想输入所有内容,您可以使用 this LIFT()
宏1
#define RETURNS(...) noexcept(noexcept(__VA_ARGS__)) \
-> decltype(__VA_ARGS__){ return __VA_ARGS__; }
#define LIFT(f) [](auto&&... xs) RETURNS(f(::std::forward<decltype(xs)>(xs)...))
你会像这样使用lit
auto func = LIFT(exampleFunction);