簡體   English   中英

Boost如何為類型選擇創建地圖?

[英]Boost how to create a map for types selection?

所以我用BOOST.EXTENTION加載模塊。 我有一個描述每個模塊的特殊文件。 我從該文件讀取變量。

這樣的例子:

shared_library m("my_module_name");
// Call a function that returns an int and takes a float parameter.
int result = m.get<int, float>("function_name")(5.0f);
m.close();

對我來說會變成:

shared_library m("my_module_name");
// Call a function that returns an int and takes a float parameter.
int result = m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>("function_name")(5.0f);
m.close();

如何創建可以映射標准和服裝類型的地圖?

更新:

可能帶有變體

  shared_library m("my_module_name");
  int result = m.get<boost::variant< int, float, ... other types we want to support >, boost::variant< int, float, ... other types we want to support > >("function_name")(5.0f);
    m.close();

可以暫停嗎? 因此,只要在其中聲明了所有想要的類型,我們就不會在乎嗎?

為此,您將需要一個異構映射-也就是說,其元素可以是不同的類型。 此外,您將需要具有從函數返回類型的能力,而不僅僅是變量。


現在,可以通過Boost.Variant或簡單的union來實現異構映射,但這將其綁定到編譯時:我們需要知道每種可能創建該變體/聯合的類型。
當然, Boost.Any可以存儲所有內容及其狗,但問題再次出現:您需要再次從Boost.Any提取真實類型。 問題重演。 而且,如果您知道真實類型,還可以制作一個變體/聯合,從而省去any_cast麻煩。


現在,對於另一個麻煩的事情:

m.get<myMap["TYPE_1_IN_STRING_FORM"], myMap["TYPE_2_IN_STRING_FORM"]>

為了使以上代碼行有效,您需要C ++不具備的兩個功能: 返回類型運行時模板的功能 讓我們暫時忽略第一點。
模板是編譯時的 ,而get函數就是這樣的模板。 現在,要使用該模板,您的myMap將需要能夠在編譯時返回類型,同時在運行時填充類型。 看到矛盾了嗎? 這就是為什么需要運行時模板的原因。


可悲的是,在C ++中,運行時恰好不可能做到這三件事(或者非常困難,而且非常非常有限): 異構數據類型(沒有恆定大小),返回類型模板
所有涉及類型的事情都需要在編譯時完成 此博文由@Gman這一問題有所關聯。 如果您想知道C ++ 不能做什么,那么絕對值得一讀。


因此,總結一下:您將需要重新考慮並重構您的問題和解決方案。 :|

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM