1

これは私が管理するテンプレート関数ではないと仮定します:

template<class T, class U>
U templatefunc(T t){ //(...); }

タイプのテンプレート関数であるデフォルトの引数を持つ関数を持つことはできますか

templatefunc<int,double> 

void ポインターを宣言する方法は次のとおりです。

void _new_func( const void*=&templatefunc<int,double>)

いいえ、関数へのvoidポインターを持つことはできないため、関数ポインターでなければなりませんよね?

以前は:

void _new_func(const void* = boost::test_tools::check_is_close) 

しかし、boost 1.54 では、check_is_close がテンプレートであるため、OK ではありません。

4

2 に答える 2

1

の型は、型の1 つの引数を&templatefunc<int,double>返し、受け取る関数へのポインタです。テンプレート引数はもはや重要ではありません - (インスタンス化された) 関数の名前です。したがって、次のことができます。doubleinttemplatefunc<int,double>

void _new_func(double(*func)(int) = &templatefunc<int,double>)

ただし、さまざまな引数と戻り値の型を持つ関数を取りたいようです。この場合、引数を渡さない場合のオーバーロードを指定できます。

template <typename T, typename U>
void _new_func(U(*func)(T)) {
}

void _new_func() {
  _new_func(&templatefunc<int,double>);
}

これで呼び出すことができ、関数ポインタがテンプレート化されたバージョンに_new_func()渡されます。の別のインスタンス化で&templatefunc<int,double>呼び出したい場合は、たとえば次のようにできます。_new_functemplatefunc

__new_func(&templatefunc<float, double>);
于 2013-03-04T19:50:26.180 に答える
1

テンプレート関数のインスタンス化は関数であるため、関数で実行できることはすべて、テンプレート関数のインスタンス化でも実行できます。void*ただし、関数が通常の関数であるかテンプレート関数のインスタンス化であるかに関係なく、関数のアドレスを移植可能に格納することはできません。

于 2013-03-04T19:49:15.993 に答える