実行時に関数の引数を生成する必要があるという要件があります。コンパイル時には、引数の数や型はわかりません。実行時にファイルから読み取り、コードを生成して動的にロードする必要があります。
以前、M4 マクロ生成言語を使用したことがあります。読みやすさと使いやすさを犠牲にして、優れたパフォーマンスを提供します。
今回はその道を行きたくなかったので、C++11 Variadic テンプレートを使用することを考えていました。
より良い代替手段はありますか?
実行時に関数の引数を生成する必要があるという要件があります。コンパイル時には、引数の数や型はわかりません。実行時にファイルから読み取り、コードを生成して動的にロードする必要があります。
以前、M4 マクロ生成言語を使用したことがあります。読みやすさと使いやすさを犠牲にして、優れたパフォーマンスを提供します。
今回はその道を行きたくなかったので、C++11 Variadic テンプレートを使用することを考えていました。
より良い代替手段はありますか?
コンパイル時にすべての可能な引数の型リストを知り、それぞれのテンプレートをインスタンス化する必要があるため、Varadic テンプレートは機能しません。
あなたの問題は本質的に、型の実行時のシリアライゼーションとデシリアライゼーションです。C++ には、これを行うための「組み込みの」標準的な方法がありません。
GenericParameter
いくつかのタイプを作成してから、次のものを用意する必要があります。
`vector<GenericParameter*> params`
または類似。次に、エンコードする型ごとに、GenericParameter の派生クラスを作成してボックス化します。一連のパラメーターをシリアル化する場合、派生クラスごとにある種の型 ID を作成して保存し、そのクラスのデータをシリアル化する必要があります。同様に、反対方向では、型 ID を読み取り、その型 ID の適切な派生クラスを構築してから、そのクラスのデータを入力します。
これを取得した後、varadic テンプレートを使用して、params のベクトルがコンパイルされた関数と一致することを確認し、実行時ベクトルを関数の静的に既知のシグネチャにバインドするだけでなく、ジェネリック ベクトルを生成し、パラメーターをネイティブ タイプにボックス化解除します。反対方向も同様。
注目すべきものは protobuf と呼ばれ、Google ではこの種の目的で頻繁に使用されており、私はそれについて良いことを聞いています。