2012-12-27 4 views
8

これはかなり可能ですが、これは可能かもしれませんが、テンプレートメタプログラミングで私よりも経験豊富な人が私を啓発します。私は、テンプレートを使用して自動化されたLUA機能結合システムを書いて、部分的特殊化を使用して機能タイプを抽出していますC++のテンプレートメタプログラミングを使用した関数型からの呼び出し規約の抽出

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(グローバル&メンバ関数を)倍最大数呼び出し規約

だから私は、コプパターン処理の量を減らすために、テンプレートパラメータ(実際には型ではないのでおそらくそうではない)として呼び出し規約を取得する方法があるのだろうかと思います。

答えて

1

このタイプのパラメータを扱うときにできることは、次のいずれかです。

あなたのテンプレートは次のようになります1つの余分のパラメータを追加します。

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

をあなたは簡単にこれ一つだけを実装する必要があります、実際にCallType内の派遣を非表示にすることができますコールの各タイプのクラス。

は、ラッパー

を作る私はあなたのクラスがすでにラッパーオブジェクトであることを推測しているが、あなたは簡単に、さらに一歩行くことができます。

あなたは、コールタイプごとにラッパーを作成することができ、その後にテンプレートを変更することができます

Function_c<int, WrapperStdCall<int (*)()> > x;

:このよう

template < typename T, typename Functor > class Function_c;

Instanciating

関連する問題