Lea*_*der 4 c++ overloading const c++11
#include <functional>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class A
{
public:
void doStuff(function<void (const string *)> func) const
{
cout << "Const method called" << endl;
for(const auto& i_string : m_vec)
func(i_string);
}
void doStuff(function<void (string *)> func)
{
cout << "Non-const method called" << endl;
doStuff([&func](const string *str)
{
auto mutableString = const_cast<string *>(str);
func(mutableString);
});
}
private:
vector<string *> m_vec;
};
int main()
{
auto a = A{};
a.doStuff([](string *str){
*str = "I modified this string";
});
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,永远不会调用const方法.如果代码看起来很奇怪,这就是我想要做的:
我让客户端通过传递函数来迭代对象,而不是getter方法.要启用const和非const访问,我想提供const和非const重载.此外,为了避免复制和粘贴,我想根据const方法实现非const方法:我的代码中的const方法实际上比我在这里使用的方法更复杂.
现在,我的问题是:如果运行此代码,它将递归调用非const函数,直到堆栈溢出.我不明白为什么doStuff([&func](const string *str)非const方法中的行调用自身而不是const方法.
非const方法被声明为可以使用string *参数调用的接受函数.提供的功能接受const string *.string *被隐含地转换为const string*.因此,函数with const string *是非const方法的可接受参数,并且选择非const方法,因为它this也是非const.
使用const_caston this来使用const方法:
const_cast<const A*>(this)->doStuff(…);
Run Code Online (Sandbox Code Playgroud)