代码:
template <typename T, typename U>
class create_map
{
std::map<T, U> m_map;
public:
create_map(const T& key, const U& val)
{
m_map[key] = val;
}
create_map<T, U>& operator()(const T& key, const U& val)
{
m_map[key] = val;
return *this;
}
operator std::map<T, U>()
{
return m_map;
}
};
这段代码的目的是为了能够指定特定的键/值对的映射,通过链接调用operator()
,像
create_map<int, std::string>(1, "blah")(2, "hah")(3, "doh")
由于该类没有默认构造函数,因此无法使用它来创建空映射。这可能是设计。或者它可能是一个设计错误。
的
operator std::map<T, U>()
{
return m_map;
}
限定了转换到std::map<T, U>
,这是它的所有的最终结果。
无论指定create_map
还是std::map
,都可以隐式调用它,例如在函数调用中使用create_map
表达式作为参数。
但是,它可能是非常低效的,因为它复制地图。编译器可能会优化复制。但它不必要地依赖于实施质量(尽管有时候这是最好的)。
所以应该改为
operator std::map<T, U> const&() const
{
return m_map;
}
的const
底有允许create_map
声明为const
和使用。
将此转换为参考时,存在与使用参考参数相同的问题,即理论上存在混叠的可能性,其中保留对const
的引用的代码不准备处理引用对象的更改。但实际上它不是一个问题。例如,作为正式的论点,我们当然会写std::string const& s
(而不仅仅是std::string s
),并且如果有任何错误产生,很少会遇到任何问题。
干杯&心连心,
请重新格式化您的代码正确(在编辑器中选中它,然后点击“编码”工具按钮) – datenwolf 2011-01-22 16:18:06