Первоначальная проблема заключалась в том, как работать с std::map<std::wstring, std::wstring> >
безопасным способом, поскольку равные типы ключа и значения чрезвычайно подвержены ошибкам. Поэтому я решил создать простую оболочку для значения:
struct ComponentName
{
std::wstring name;
// I want to prohibit any implicit string-ComponentName conversions!!!
explicit ComponentName(const std::wstring& _name) : name(_name)
{
}
bool operator<(const ComponentName& item_to_compare) const
{
return name < item_to_compare.name;
}
};
typedef std::map<std::wstring, ComponentName> component_names_map;
Но следующий код работает хорошо!
component_names_map component_names;
// Are you sure that ComponentName constructor cannot be called implicitly? ;)
component_names_map::value_type a_pair = std::make_pair(L"Foo", L"Bar");
Это работает, потому что конструктор std::pair<std::wstring, ComponentName>
copy явно использует строковый конструктор ComponentName для назначения экземпляра std::pair<std::wstring, std::wstring>
. Это абсолютно законная операция. Однако он выглядит как "неявный" вызов конструктора ComponentName.
Итак, я знаю причину проблемы, но как я могу избежать этого "неявного" преобразования wstring-ComponentName
?
Самый простой способ - не объявлять конструктор строк, но делает инициализацию ComponentName неудобной.