带有auto和default参数的C++成员函数

Dan*_*izo 1 c++ lambda class

我试图在C++类中实现一个成员函数,该类具有auto参数(lambda)和带有默认值的int参数.像这样的东西:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

编译器(MinGW 7.2.0,flags:-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
Run Code Online (Sandbox Code Playgroud)

我真心不明白这个错误.有人可以解释一下这个错误的原因以及如何修复它?先感谢您.

Edg*_*jān 10

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);
}
Run Code Online (Sandbox Code Playgroud)

Wandbox示例

另一种可能的方法是使用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);
}
Run Code Online (Sandbox Code Playgroud)

Wandbox示例

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


如果您想扩展有关将函数传递给函数的知识,那么Vittorio Romeo的这篇文章给出了一个很好的解释+一些基准.