c++ std::函数和默认函数参数

vnzz0bqm  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(199)

下面是使用std::function的简单示例

#include <iostream>
#include <functional>

//A function that sums two numbers.
//Arguments having default values.
void SumOfTwoNumbers(int a = 42, int b = 42)
{
    std::cout << "Sum of two numbers :: " << a + b << std::endl;
}

int main()
{
    std::function<void(int, int)> testFunc = SumOfTwoNumbers;

    SumOfTwoNumbers();          //Works
    testFunc();                 //Compile time error          
    testFunc(40, 40);           //Works

    return 0;
}

在main函数中,有三个函数调用。第一个和最后一个都能工作。而第二个调用testFunc()时没有任何参数,会产生编译时错误。
它不应该考虑默认参数并成功执行吗?

e4yzc0pl

e4yzc0pl1#

不,函数参数的默认值不是函数签名的一部分。它们只在调用点求值。
你可以使用lambda,但是你需要重新定义默认值:

auto testFunc = [](int a = 42, int b = 42) { SumOfTwoNumbers(a, b); };

...并且将这样的lambda存储在std::function中将再次导致相同的问题,因为lambda的签名也是void(int, int)
但是,您 * 可以 * 定义自己的 Package 器函子(而不是使用std::function),它具有 * 多个 * operator()重载:

struct {
    void operator()() { SumOfTwoNumbers(42, 42); } 
    void operator()(int a) { SumOfTwoNumbers(a, 42); } 
    void operator()(int a, int b) { SumOfTwoNumbers(a, b); } 
} testFunc;

相关问题