私は TMP の世界に不慣れで、ブースト mpl または融合でのベクターの使用に関して助けが必要です。
だからここに状況があります:
ランタイム ライブラリとして実装されているマルチスレッド環境での非同期関数呼び出し用の API があります。関数には可変数の引数があります。
したがって、アプリケーションのコードは次のようになります。
void funcA(int a){
// code
}
void funcB(int a, double b, char C){
// code
}
int main(){
int a = 1;
double b = 2.0;
char c = 'C';
async_call(funcA, a);
async_call(funcB, a,b,c);
}
ライブラリは、いくつかの内部データ構造に引数の値を格納し、ライブラリによって決定された将来のある時点で関数を実行します。いくつかの最適化を実装するには、特定のアプリケーションで考えられるさまざまな数の引数をすべて把握し、引数の数を含む const 配列を作成する必要があります。したがって、コンパイル中に次のようなものを作成する必要があります。
const int ArgsNumber[] = {1,3};
async_call を可変個引数テンプレート関数として実装し、内部的に引数の数をカウントします (いくつかのテンプレート メタプログラミングを使用して、送信された各関数の count_args<...>
template<typename Tr, typename ...Tn>
void async_call(Tr (*func)(Tn...), Tn... args) {
// ...
int args_num = count_args<Tn...>::value;
// ...
}
ここで質問があります。グローバル MPL または FUSION ベクトルに count_args<...> の結果を入力してから、それを const 配列に変換できますか?
次のように、ブースト プリプロセッサが MPL ベクトルから const 配列を生成することを提案するコードを見てきました。
#define MACRO(z, i, data) \
mpl::at_c<data,i>::value
static const data[] = { BOOST_PP_ENUM(N, MACRO, argsTable) };
したがって、mpl ベクトルをグローバルに宣言します。
typedef mpl::vector_c<int> argsTable;
そして、次のように async_call 関数 (main から呼び出される) から push_back を試みます。
typedef typename mpl::push_back<argsTable,mpl::int_<count_args<Tn...>::value>>::type xyz;
ただし、push_back によって返された新しいシーケンスで argsTable を何とか「更新」する必要があるため、ベクトルは更新されません。これはできますか?MPL で十分ですか、それとも融合が必要ですか?
解決策に関する他の提案は大歓迎です!