Проблема в возврате значений operator[]
Проблема в возврате значений, проблема это - string& operator[] (const string index) и bool& operator[] (const string index) и она мне не позволяет взять значение с string(возвращает 1) но когда я переставляю строки местами(bool& на string&,вместе с их содержимым) то всё получается наоборот и возвращает пустоту, как это можно исправить? Мой код:
#include <iostream>
#include <string>
#include <map>
using namespace std;
class StringData
{
private:
map<string, string> dataStrings;
map<string, bool> dataBools;
public:
string& operator[] (const string index)
{
return dataStrings[index];
}
bool& operator[] (const string index)
{
return dataBools[index];
}
};
int main()
{
StringData a;
a["test"] = false;
a["test2"] = "Hello";
cout << a["test"];
cout << a["test2"];
system("Pause");
}
Ответы (2 шт):
Неработоспособна сама идея - перегрузка, дающая две функции с одинаковыми сигнатурами:
string& operator[] (const string index);
bool& operator[] (const string index);
Не допускает такого С++.
Рекомендую решение:
class StringData
{
private:
map<string, string> dataStrings;
map<string, bool> dataBools;
public:
string& operator[] (const string index)
{
return dataStrings[index];
}
bool& operator[] (const char * index)
{
return dataBools[index];
}
};
int main()
{
StringData a;
a["test"] = false;
a["test2"s] = "Hello";
cout << a["test"] << endl;
cout << a["test2"s] << endl;
}
Вариант от @Harry весьма странный и на код ревью я бы жестоко отказал за такое. Возьмём предложение @HolyBlackCat и оформим
#include <iostream>
#include <string>
#include <map>
#include <variant>
using namespace std;
class StringData
{
public:
// будем храть все в варианте, но это с++17
using two_t = std::variant<string,bool>;
private:
map<string, two_t> dataStrings;
public:
two_t& operator[] (const string index)
{
return dataStrings[index];
}
};
// нам нужен оператор вывода этой структуры
std::ostream& operator<<(std::ostream& os, const StringData::two_t& t) {
if(auto pval = std::get_if<std::string>(&t)) {
os << *pval;
}
else if (auto pval = std::get_if<bool>(&t)) {
os << *pval;
}
else {
os << "<none>"; // ну мало чего
}
return os;
}
int main()
{
StringData a;
a["test"] = false;
a["test2"] = "Hello";
cout << a["test"];
cout << a["test2"];
}
правда оно только для с++17 и старше, но всегда можно и это обойти.