gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:09 27 4
gpt4 key购买 nike

我正在尝试在 C++ 类中实现一个成员函数,该类具有一个自动参数(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);
}

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

#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);
}

Wandbox example

另一种可能的方法是使用 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);
}

Wandbox example

最后,您可以使用指向函数的指针,但这太C 方式...


如果您想扩展有关将函数传递给函数的知识,this article维托里奥·罗密欧 (Vittorio Romeo) 提供了出色的解释和一些基准。

关于具有自动和默认参数的 C++ 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48140050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com