Как правильно перегрузить оператор присваивания для структуры в C++?
Нужно чтобы структура DurationInfoSum при парсинге из JSON формата заполнялась данными из простой строки.
struct DurationInfoSum
{
double sum;
DurationTypeInfo durationInfoType; // enum
};
В C# есть такая реализация через explicit operator
public static explicit operator DurationInfoSum(String obj)
А как добиться такого же эффекта на С++?
JSON:
"durationInfo": {
"Value": "4M" // "4M" - это и есть DurationInfoSum только в виде строки
}
Пробовал разные варианты перегружать конструктор. Но парсер пишет, что все равно не можно преобразовать строку в DurationInfoSum.
Ответы (1 шт):
Автор решения: needKVAS
→ Ссылка
Пример для неявных преобразований:
#include <iostream>
#include <string>
struct MyStruct
{
MyStruct() {
std::cout << "MyStruct()\n";
}
MyStruct(const std::string& str) : mystring(str) {
std::cout << "MyStruct(const std::string& str)\n";
}
MyStruct& operator=(const std::string& str) {
mystring = str;
std::cout << "operator=\n";
return *this;
}
std::string mystring;
};
void foo(const MyStruct&) {}
int main()
{
std::string test = "test";
MyStruct b(test); //Используется конструктор MyClass(const std::string& str)
MyStruct a; //Используется конструктор MyClass()
a = MyStruct(test); //Используется автоматически созданный оператор присваивания
//и конструктор MyClass(const std::string& str)
a = test; //Используется созданный нами оператор присваивания
foo(test); //Неявный вызов конструктора MyClass(const std::string& str)
return 0;
}
Если объявить второй конструктор как explicit MyStruct(const std::string& str), то foo(test); выдаст ошибку компиляции и преобразование нужно будет сделать явно: foo(MyStruct(test));.