空std::function
並不那麼重。你可以映射到一個包含每個結構的結構。你知道哪個是有效的,所以只能訪問那個。
如果您有需要,而不在任一作爲參數傳遞上都均勻工作模板代碼:
#include <string>
#include <functional>
#include <map>
#include <tuple>
#include <iostream>
#include <math.h>
template<typename T>
using my_maps = std::tuple< std::map<std::string, std::function<T()>>, std::map<std::string, std::function<T(int)>>>;
int main() {
my_maps<double> maps;
std::get<0>(maps)["pi"] = [](){ return 3.14; };
std::get<1>(maps)["e^"] = [](int x){ return pow(2.7, x); };
std::cout << std::get<1>(maps)["e^"](2) << "\n";
std::cout << std::get<0>(maps)["pi"]() << "\n";
}
這有兩張地圖,在訪問get<0>
或get<1>
的差異。這樣做的好處是,如果您正在選擇要在模板中訪問哪兩個模塊,它可以靜態選擇0或1,並使用通用代碼。如果你不需要這個,只需要兩個std::map
。
A boost::variant
也有效(映射到0ary或1ary函數的variant
)。你也可以在帶有枚舉的struct
中使用C++ 11 union
(注意它將沒有默認構造函數,或者複製構造函數,除非你提供一個), - 基本上是一個枚舉(它的副本爲union
)貧民窟boost::variant
。
@OliCharlesworth,這是一種出路!在某些時候,我希望能夠隱藏這個,例如,只有一個獲得地圖類的方法。但我當然可以解決它。 –
爲什麼不只是有兩個容器?由於無論如何您必須進行一些檢查,因此您知道如何調用函數,您還可以通過分隔兩種函數來進行檢查。 –