1

テンプレート引数にデフォルトのコンストラクターが存在するかどうかを確認しようとしています。私はこのようなことをしたい:

template <typename A>
class Blah
{
   Blah() { A* = new A(); } 
}

しかし、コンパイル時にSFINAEまたはその他のトリックを介してそのコンストラクターが存在するかどうかを検出し、存在static_assertしない場合は独自のコンストラクターを発生させたいと思います。

この問題std::vectorは、「デフォルトのコンストラクター」を持たないがデフォルトのパラメーターを持つコンストラクターを持つクラス(のような)がある場合に発生します。

したがって、を使用してstd::has_trivial_default_constructorもtrueは返されません。私は使用できますがnew vector<T>()

4

2 に答える 2

6

タイプ特性の可能な実装は次のとおりです。

template<typename T>
class is_default_constructible {

    typedef char yes;
    typedef struct { char arr[2]; } no;

    template<typename U>
    static decltype(U(), yes()) test(int);

    template<typename>
    static no test(...);

public:

    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

struct foo {
    foo(int) {}
};

int main()
{
    std::cout << is_default_constructible<foo>::value << '\n'        // 0
              << is_default_constructible<std::vector<int>>::value;  // 1
}
于 2012-12-09T10:46:41.183 に答える
4

std::has_trivial_default_constructorC++標準にはありません。これは、Boostによるgccの機能強化のようです。これはあなたが望むものではありません。何かが些細なデフォルトコンストラクタを持っているかどうかをチェックしたくありません。あるクラスにデフォルトのコンストラクターがあるかどうかを確認したいのですが、些細なことです。使用しますstd::is_default_constructible(c ++ 11準拠のコンパイラーを想定)。

于 2012-12-09T10:43:40.950 に答える