私は基本的にタイプを手動で指定することなくジェネリックC関数のラッパーを生成したいと考えています。だから私は固定プロトタイプのコールバックを持っているが、私はラップされた関数の型に基づいてラッパーでいくつかの特別なコードを行う必要があるだろう...だから、基本的に私はクラステンプレートタイプのないテンプレートパラメータ...これがテンプレートです! (C++)
// this is what we want the wrapped function to look like
typedef void (*callback)(int);
void foobar(float x); // wrappee
// doesn't compile
template< T (*f)(S) > // non-type template param, it's a function ptr
struct Wrapper
{
static void wrapped(int x)
{
// do a bunch of other stuff here
f(static_cast<S>(x)); // call wrapped function, ignore result
}
}
をそして私のような何かをしたいと思います:準拠したインタフェースなどに私の機能をラップする
AddCallback(Wrapper<foobar>::wrapped);
しかし、問題は、私はちょうど先にして使用行くことができないということですWrapperテンプレートの関数のパラメータに "S"が含まれている場合は、最初にパラメータとして指定する必要があります。
template< class T, class S, T (*f)(S) >
struct Wrapper
// ...
しかし、これは、()を使うのがもっと苦痛だということを意味します。理想的には、そこに関数ポインタを渡して、パラメータの型(および戻り値の型)を自動的に調整してください。明らかにするために、ラップされた関数の中で関数ポインタの型を参照する必要があります(したがって、私はSまたはTと同等のものが必要です)。
これを行う方法はありますか?
@ damndirtyape:私はあなたの質問について考えてきました。私は似たようなことをやったと思います。残念ながら、それは多くのコードを含んでいました。基本的には、私のソリューションはoperator()をオーバーロードした基底クラスを持ち、渡された関数型に基づいて基底クラスを構築するファクトリ関数を持っていました。あなたが好きなのであれば、どこかのペーストビンにコードを掲載することができます。 –