私は最近libffiを使用していますが、C APIを使用しているため、抽象化はvoidポインター(古き良きC)を使用して行われます。このAPIを利用するクラス(可変個引数テンプレートを使用)を作成しています。クラス宣言は次のとおりです。(ここで、Ret
=戻り値およびArgs
=関数の引数)
template <typename Ret, typename... Args>
class Function
このクラス内で、2つの異なる関数も宣言されています(簡略化)。
Ret Call(Args... args); // Calls the wrapped function
void CallbackBind(Ret * ret, void * args[]); // The libffi callback function (it's actually static...)
Call
から使えるようになりたいCallbackBind
; それが私の問題です。void*
配列をテンプレート化された引数リストに変換する方法がわかりません。これは私が多かれ少なかれ欲しいものです:
CallbackBind(Ret * ret, void * args[])
{
// I want to somehow expand the array of void pointers and convert each
// one of them to the corresponding template type/argument. The length
// of the 'void*' vector equals sizeof...(Args) (variadic template argument count)
// Cast each of one of the pointers to their original type
*ret = Call(*((typeof(Args[0])*) args[0]), *((typeof(Args[1])*) args[1]), ... /* and so on */);
}
これが達成できない場合、回避策やさまざまな解決策がありますか?