@Mercury13
Программист на «си с крестами» и не только

Как лучше реализовать локализацию?

У нас был такой код…
namespace loc {
  const wchar_t* get(const char* key);
}


Выяснилась такая штука. Для языков, которые мы не знаем и вынуждены «забивать» английским, а правила множественного числа другие, выводит что-то типа «5 day remaining» — просто потому, что у японского нет этих правил.

Хорошо, корректируем вот так.

struct TaggedCWstr
{
    const PluralRule* rule;
    const wchar_t* text;

    operator const wchar_t* () const { return text; }
    operator std::wstring () const { return text; }
};

namespace loc {
  TaggedCWstr get(const char* key);
}

И тут возник камень преткновения на operator std::wstring. Если я его комментирую, выводит ошибку на
std::wstring xxx() {
  return loc::get(key);    // could not convert from TaggedCWstr to wstring
}


Если оставляю, выводит ошибку на
std::wstring s;
s = loc::get("key");    // ambiguous overload for op=


Можно ли как-то удовлетворить обоих?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
s = loc::get("key");    // ambiguous overload for op=

неоднозначность у тебя появляется потому что оба конструктора std::wstring (конструктор копирования и конструктор преобразования из const wchar_t*) являются неявными.
Операторы преобразования TaggedCWstr так же являются неявными.

Эту неоднозначность нужно исключить. Замени, например, оба оператора преобразования на оператор преобразования в std::wstring_view.

Я бы не стал делать неявный оператор преобразования в std::wstring и этим позволять бесконтрольно обращаться к динамической памяти без явного понимания этого процесса. Лучше для получения std::wstring сделать operator *, а еще лучше - вообще не ломать семантику операторов и сделать метод с говорящим именем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы