空std::function
はそれほど重くありません。それぞれの 1 つを含む構造体にマップすることができます。どちらが有効かはわかっているので、その 1 つだけにアクセスしてください。
どちらも引数として渡されずに、両方を均一に操作する必要があるテンプレート コードがある場合:
#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";
}
これには 2 つのマップがあり、アクセスの違いは aget<0>
または aget<1>
です。これには、テンプレートで 2 つのうちどちらにアクセスするかを選択する場合、静的に 0 または 1 を選択して共通コードを使用できるという利点があります。これが必要ない場合は、 を 2 つだけ用意してくださいstd::map
。
Aboost::variant
も機能します ( variant
0ary または 1ary 関数の a にマップします)。C++ 11を列挙型 (のコピーを行う) で (union
指定しない限り、デフォルトのコンストラクターまたはコピー コンストラクターがないことに注意してください) を使用することもできます。これは基本的に ゲットーです。struct
union
boost::variant