#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";
});
}
W tym przykładzie metoda const nigdy nie jest wywoływana. Jeśli kod wygląda dziwnie, oto, co próbuję zrobić:Funkcja przeciążania argumentem std :: function: dlaczego metoda const nie jest wywoływana?
Zamiast metody getter, pozwalam klientom iterować obiekty, przekazując funkcję. Aby włączyć dostęp zarówno stały, jak i niestanowiący stałej, chcę zapewnić przeciążenia const i non const. Ponadto, w celu uniknięcia wklejenia kopii, chcę zaimplementować metodę non const z punktu widzenia metody const: metoda const w moim kodzie jest w rzeczywistości bardziej skomplikowana niż ta, której tu używam.
Teraz moje pytania są następujące: Jeśli uruchomisz ten kod, wywoła on rekurencyjnie funkcję non const, dopóki stos nie przepełni się. Nie rozumiem, dlaczego linia doStuff([&func](const string *str)
w metodzie non-const wywołuje samą siebie, a nie metodę const.
usunięcie 'const' spowodowałoby niejasności –
Dzięki. Nie byłem pewien. Zmienię to. – JKor