Как правильно перегрузить оператор присваивания для структуры в C++?

Рейтинг: -1Ответов: 1Опубликовано: 06.03.2023

Нужно чтобы структура 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

Пример для неявных преобразований:

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