6

次のコードがあります。

template <typename T>
void f1( T t )
{
    std::cout << "f1( " << t << " ) called." << endl;
}

template <typename T>
void f2( T t )
{
    std::cout << "f2( " << t << " ) called." << endl;
}

template <typename F, typename T>
void call( F && f, T t )
{
    f( t );
}

template <typename T>
void foo( T t )
{
    call( f1<T>, t ); // Why is <T> necessary?
                      // f1(t) is a valid expression!
    call( f2<T>, t );
}

void bar()
{
    foo( 1 );
}

関数では、有効な式ですがfoo()、テンプレート引数を指定する必要があります。f1(t)それは私のコードのいくつかの可能性を破壊しています。私の質問:

  1. テンプレート引数を指定する必要があるのはなぜですか?
  2. その制限を回避するにはどうすればよいですか? (C++11 または C++14 が許可されます)。

(ところで: 現在 Visual Studio 2010 を使用していますが、省略した場合、エラー C2896 が表示<T>されます。)

4

6 に答える 6

11

f1は関数ではなく、テンプレートです。テンプレートを関数の引数として渡すことはできません。

f1<T>は関数なので渡すことができます。

于 2013-06-18T13:03:56.607 に答える
8

1. なぜテンプレート引数を指定する必要があるのですか?

はオブジェクトでf1はなく、関数テンプレートです。オブジェクトのみを関数に渡すことができます。

2. この制限を回避するにはどうすればよいですか? (C++11 または C++14 が許可されます)。

テンプレート化されたオブジェクトを使用しますoperator()。の定義を次のように置き換えるだけですf1()

struct { template <typename T> void operator()( T t )
{
    std::cout << "f1( " << t << " ) called." << endl;
} } f1;

についても同様ですf2()。C++14 では、さらに適切に記述できます。

static const auto f1 = []( auto t )
{
    std::cout << "f1( " << t << " ) called." << endl;
};
于 2013-06-18T14:22:26.733 に答える