2016-03-25 13 views
1

可変数の引数を持つ異なる関数があるとします。最初の引数は常に他の手段で得られたポインタです。他のすべての引数は、テンプレートパックの展開を使用して別のテンプレートで取得します。次のように私はこれらの関数を呼び出すために使用
テンプレートは次のとおりです。Argからのn個の引数の使用位置mからの開始

template<typename RT, typename... Args> 
inline RT call(RT(*function)(Args...)) 
{ 
    return function(pointer_from_somewhere, bind_argument<Args>::get_arg()...); 
} 

、それはすべての引数のテンプレートの拡張を行い、これは明らかにあまりにも多くの引数があることこれが、コンパイルされません。
私はいつも他の方法で最初の引数を取得しているので、2番目の引数から始めて、sizeof...(Args) - 1引数のテンプレートパックの展開をどうすればできますか?

EDIT:テンプレートは、デモの目的のためにスリム化され
ますが、それは第一引数(ポインタ)は、最初の引数の型に常にreinterpret_cast'edされていることを、関連するかもしれません。私はstd::tuple_element<0, std::tuple<Args...>>::typeを使って第1引数の型を調べます。

+1

'bind_argument'も同様に投稿してください。 –

+0

デモンストレーションの目的で、実際の目的/問題を紹介するために例をスリム化しました。これは、高レベルのエミュレートされた関数を呼び出すエミュレータの目的であり、引数はスタックまたはレジスタから渡されます(bind_argumentはそれを行います)。 – tambre

答えて

2

これはあなたが探しているものですか?

template<typename RT, typename A0, typename... Args> 
inline RT call(RT(*function)(A0, Args...)) 
{ 
    return function(pointer_from_somewhere, bind_argument<Args>::get_arg()...); 
} 
+3

関数のパラメータに 'A0 *'を追加するのを忘れていませんか? – MikeMB

関連する問題