8

可能かどうかわからないので、これはかなり長い目で見たものですが、テンプレートのメタプログラミングで私よりも経験豊富な人が教えてくれるかもしれません。

テンプレートを使用して自動化された lua 関数バインディング システムを作成し、部分的な特殊化を使用して関数型を抽出しています。

template<typename T, T FUNCTION> class Function_c;
template<typename R, R (*FUNCTION)()> class Function_c<R (*)(), FUNCTION>; //specialized version

問題は、これは関数呼び出し規則を教えてくれないので、(VS2012 32 ビットでは) __stdcall 用にコンパイルされず、__fastcall でクラッシュすることです。特定の呼び出し規約に対処するために、別の特殊なバージョンを作成できます。たとえば、次のようになります。

template<typename R, R (__stdcall *FUNCTION)()> class Function_c<R (__stdcall *)(), FUNCTION>;

しかし、順列の数は手に負えなくなり始めています: 2 (グローバル関数とメンバー関数) x パラメータの最大数 x 呼び出し規約の数。

したがって、コピーペーストの量を削減するために、呼び出し規約をテンプレートパラメーターとして取得する方法があるかどうか疑問に思っています(実際には型ではないため、おそらくそうではありません)。

4

1 に答える 1

1

このタイプのパラメーターを処理する場合、実行できることは次のいずれかです。

パラメータを1つ追加します

テンプレートは次のようになります。

template < typename T, T function, typename CallType > class Function_c;

内で実際のディスパッチを簡単に非表示にできるため、CallType呼び出しのタイプごとに1つのクラスを実装するだけで済みます。

ラッパーを作成する

あなたのクラスはすでにラッパーオブジェクトだと思いますが、簡単に一歩先に進むことができます。

呼び出しタイプごとにラッパーを作成してから、テンプレートを次のように変更できます。

template < typename T, typename Functor > class Function_c;

このようにインスタンス化:Function_c<int, WrapperStdCall<int (*)()> > x;

于 2012-12-27T18:16:21.643 に答える