3

以下の 2 つのテンプレート関数を検討してください。

template <typename T, typename A>
T* create(A i) {
   return new T(i);
}

template <typename T, typename A>
T* create(A i) {
   return new T();
}

それらは同じ署名を持ちますが、特定の T および A に対して 1 回だけインスタンス化できます。

上記のテンプレート関数にいくつかの SFINAE イディオムを適用して、インスタンス化できるテンプレート関数のバージョンが、T に A を引数の型として受け入れるコンストラクターがある場合にのみ最初のバージョンになるようにする方法はありますか?デフォルトのコンストラクターがインスタンス化されます。次に例を示します。

// S is given, cannot be changed:
struct S {
   S(int) {}
}

int main() {
   // the first template function should be instantiated since S has S(int)
   create<S, int>(0); // the only call in the program
   // ...
}
4

1 に答える 1

5

使用is_constructible

template <typename T, typename A>
typename std::enable_if<std::is_constructible<T, A>::value, T*>::type create(A i)
{
    return new T(i);
}

template <typename T, typename A>
typename std::enable_if<!std::is_constructible<T, A>::value, T*>::type create(A i)
{
    return new T();
}
于 2012-07-01T16:53:53.930 に答える