代碼:
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