数学関数の動作を模倣する C++11 クラスを作成したいと考えています。このクラスは、関数が定義されているセットを入力として受け取り、ドメイン内の特定のポイントに関連付けられた値を設定および取得できます。
関数ドメインを構成するセットの数はアプリオリにわからないため、C++11 可変個引数テンプレートを使用して、次のようにクラスを定義したいと思います。
template<typename first_set_type, typename... additional_sets_type> class Function;
そのため、次のように新しい関数を作成できます。
Function<int, std::string, double> three_dim_function(S1, S2, S3);
ここでS1
、S2
およびS3
は、それぞれstd::set<int>
、std::set<std::string>
およびstd::set<double>
です。値の設定と取得は、次の場合と似ている必要がありますstd::tuple
。
three_dim_function.set<1, "a", 1.23>(12);
double twelve = three_dim_function.get<1, "a", 1.23>();
最も可能性std::unordered_map
が高いのは、ドメインとコドメインの間のバインディングを格納するための理想的なデータ メンバーです。
std::unordered_map<std::tuple<first_set_type, additional_set_types...>, double> data_;
2 つの問題は同一ではありませんが (私の場合は、それぞれを格納する必要はないかもしれません) 、可変個引数クラスのテンプレートの初期化とメンバーへのアクセスからのコードを適応させようとしましたstd::set
。
編集#1:私が直面している問題をよりよく強調しようとします. リンクされた質問では、クラスは再帰呼び出しによって作成されます。ただし、私の場合、コンストラクターの実装方法、つまり、入力セットから関数のドメインを設定する方法を理解するのに苦労しています。data_
考えられる 1 つの方法は、コンストラクターを使用して、データ メンバーの入力セットのデカルト積によって生成されたすべてのキーを事前に入力することです。問題は、パラメーター パックを反復処理する方法がわからないことです。
暫定的な解決策 #1
これは暫定的な実装です: @robert-mason の貢献に基づく pastebin.com/FMRzc4DZ 。is_in_domain()
残念ながら、呼び出されるとすぐにコンパイルされません (clang 4.1、OSX 10.8.4) 。しかし、一見、すべてがうまくいっているように見えます。何が間違っている可能性がありますか?