C++具有自动参数和默认参数的成员函数

C++ member function with auto and default arguments

本文关键字:参数 默认 成员 函数 C++      更新时间:2023-10-16

我正在尝试在具有自动参数(lambda(和具有默认值的int参数的C++类中实现一个成员函数。像这样:

class Base {
public:
    int add_one(auto fobj, int b=3);
};
int Base::add_one(auto add_fcn, int b) {
    return add_fcn(1, b);
}

但是,像这样的简单测试无法编译:

#include <iostream>
class Base {
public:
    int add_one(auto fobj, int b=3);
};
int Base::add_one(auto add_fcn, int b) {
    return add_fcn(1, b);
}
int main() {
    int ans;
    auto add_fcn = [](int a, int b) -> int {return a + b;};
    Base obj;
    ans = obj.add_one(add_fcn);
    std::cout << ans << "n";
    return 0;
}

编译器(MinGW 7.2.0,标志:-std=c++14(给我的错误如下:

error: call to 'int Base::add_one(auto:2, int) [with auto:1 = main()::<lambda(int, int)>]' uses the default argument for parameter 2, which is not yet defined

我真诚地不明白这个错误。有人可以解释一下此错误的原因以及如何修复吗?提前谢谢你。

auto参数是gcc扩展。这意味着它不是解决问题的标准兼容方法。

我不确定上述错误的确切原因是什么,但您可能会使用效果良好的模板成员函数达到相同的效果:

class Base {
public:
    template<typename F>
    int add_one(F fobj, int b = 3);
};
template<typename F>
int Base::add_one(F add_fcn, int b) {
    return add_fcn(1, b);
}

魔杖盒示例

另一种可能的方法是使用 std::function(这意味着一些性能开销(:

class Base {
public:
    int add_one(std::function<int(int, int)> fobj, int b = 3);
};
int Base::add_one(std::function<int(int, int)> add_fcn, int b) {
    return add_fcn(1, b);
}

魔杖盒示例

最后,你可以使用指向函数的指针,但它太 C 方式了......


如果你想扩展将函数传递给函数的知识,维托里奥·罗密欧的这篇文章给出了一个很好的解释+一些基准。