如果使用std::map<std::string,object>
來保留按名稱排序的對象,則地圖的value_type
(std::pair<string,object>
)是一個便利的類,它保證有用的功能,例如,哪個容器要使用map或set或else?
typedef std::map<std::string,object> object_map;
typedef typename object_map::value_type named_object;
void function(named_object const&);
// with the following possible use case
void foo(std::string const&name, object_map const &omap)
{
auto obj=omap.find(name);
if(obj==omap.end()) throw std::runtime_error("name not found");
function(*obj);
}
到目前爲止,這麼好。後來我延長我的對象
struct extended_object : object { /* more data */ };
,並保持按名稱排序,也擴展對象,通過std::map<std::string,extended>
。 我可以定義。
typedef std::map<std::string,extended_object> extended_object_map;
typedef typename extended_object_map::value_type named_extended_object;
不幸的是,我不能
void foo(std::string const&name, extended_object_map const& emap)
{
auto eobj=emap.find(name);
if(eobj==emap.end()) throw std::runtime_error("name not found");
function(*eobj); // cannot convert *eobj to const named_object&
}
現在,我的問題是如何解決這個問題呢?我考慮使用reinterpret_cast<>
function(reinterpret_cast<const named_object&>(*eobj));
基本上假定的named_object
和named_extended_object
數據佈局是完全一樣的基類和派生的。這是安全/可推薦的嗎? 另外,我考慮使用(而不是std::map
)std::set
與主要類型 named_object
和重新定義
struct named_extended_object : named_object { /* more data */ };
這種方法的問題是,爲了std::set::find()
一個對象,我必須提供不只是一個名字字符串,但整個對象或甚至擴展對象。根據cppreference,std::set::find()
將解決這個問題在C++ 14(過載3 & 4),但我應該在同一時間做什麼?
嘗試下載的副本C++規範,您可以在此網站中找到鏈接:http://isocpp.org/get-started然後閱讀reinterpret_cast。我認爲你的結論是,在這種情況下reinterpret_cast是沒有意義的。有問題的類型是std :: pair,其中每個對象都有不同類型的對象。 Reinterpret_cast不會幫助你。 – shawn1874
我不確定你是否理解一套是什麼。一組是鍵值對,但鍵和值都是相同的類型,所以當然你必須將唯一的類型對象傳遞給find,因爲這是找到任何東西的唯一可能方式。一套不可能以任何方式幫助你考慮你想要達到的目標。 std :: pair中的類型通過繼承關聯的事實並不意味着您可以簡單地從一個對類型轉換爲另一個類型。該語言不支持。 – shawn1874
@ shawn1874 _「所以當然你必須將唯一的類型對象傳遞給find,因爲它是找到任何東西的唯一可能的方式。」_不在C++中14。請參閱[N3657](http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2013/n3657.htm)和較早的[N3465](http://www.open-std。 org/jtc1/sc22/wg21/docs/papers/2012/n3465.pdf)建議它是基於。 –