1

だから私は 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();

半減できますか?必要なすべての型が宣言されている限り、気にしないでしょうか?

4

1 に答える 1

1

そのためには、異種マップが必要になります。つまり、その要素はさまざまなタイプにすることができます。さらに、変数だけでなく、関数から を返す機能が必要になります。


Boost.Variantここで、または単純なで異種マップが可能になりますがunion、それはコンパイル時にバインドされます。そのバリアント/ユニオンを作成できるすべての型を知る必要があります。
もちろん、Boost.Anyすべてとその犬を格納することは可能ですが、問題が再び発生します。そこから実際の型をBoost.Any再度抽出する必要があります。問題は繰り返されます。また、実際の型がわかっている場合は、バリアント/ユニオンを作成してany_cast問題を解決することもできます。


さて、別の厄介なことについて:

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

上記の行を機能させるには、C++ にはない 2 つの機能が必要です:型とランタイム テンプレートを返す機能です。最初の点はしばらく無視しましょう。 テンプレートはコンパイル時であり、関数はそのようなテンプレートです。ここで、そのテンプレートを使用するには、コンパイル時に型を返すことができる必要がありますが、実行時にデータが取り込まれます。矛盾がわかりますか?そのため、実行時テンプレートが必要になります。
getmyMap


悲しいことに、実行時に C++ でこれら 3 つのことを行うことはできません (または非常に難しく、非常に制限されています) 。 型に関することはすべてコンパイル時に行う必要があります。@Gmanによるこのブログ投稿は、その問題とある程度相関しています。C++ でできないことを知りたい場合は、一読の価値があります。


結論として、問題と解決策を再考してリファクタリングする必要があります。:|

于 2011-04-17T15:33:00.157 に答える