最初的问题是如何以安全的方式使用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's constructor cannot be called implicitly? ;)
component_names_map::value_type a_pair = std::make_pair(L"Foo", L"Bar");
它之所以有效,是因为std::pair<std::wstring, ComponentName>
复制构造函数显式地使用ComponentName的字符串构造函数来分配std::pair<std::wstring, std::wstring>
实例。这是一个绝对合法的行动。然而,它看起来像是对ComponentName构造函数的“隐式”调用。
所以我知道问题的原因,但是我如何避免这种“隐式”的wstring-ComponentName
转换呢?最简单的方法是不声明字符串构造函数,但这会使ComponentName初始化变得不方便。
发布于 2011-11-15 20:00:22
简单:
enum FromString { fromString };
ComponentName( FromString, std::wstring const& aName)
: name( aName )
{}
https://stackoverflow.com/questions/8135555
复制相似问题