2017-09-09 7 views
1

is_default_constructibleやis_move_constructibleなどのテンプレートが、クラスが "デフォルト"とマークされているかどうか、またはムーブコンストラクタであるかどうかをクラス内で調べる方法を教えてください。C++ - is_default_constructibleはどのように実装されていますか?

+1

'is_default_constructible'はコンストラクタ' = default'をテストしませんが、コンストラクタがパラメータなしで使用できるかどうかをテストします。それでもユーザー定義が可能です。 –

答えて

2

コンパイル時に式の妥当性を確認するには、複数の方法があります。 detection idiomは、あなたが言及した特性を実装するために使用できるC++ 11のテクニックです。ここでは例だ(これは近似値で、実際のis_default_constructibleはもっと複雑です)"checking expression validity in-place with C++17"

template <class T> 
using default_constructible_impl = decltype(T{}); 

template <class T> 
using is_default_constructible = std::is_detected<default_constructible_impl, T>; 

は、ここで私はあなたが有用見つけるかもしれない被写体に書いた記事です。そのタイトルが示唆しているものの、C++ 11とC++ 14のテクニックもカバーしています。

+0

このような特質のすべてがこのように機能するわけではないことに注意してください。stdライブラリはC++で実装できない特性を必要とします。そして、実装可能ないくつかの特性は、何とか(具体的な例として、msvcのチートでの整数シーケンスの生成として)不正を行うことによって実装される可能性があります。 – Yakk

+0

いいえ、is_default_constructibleではありません。そして 'std :: is_detected_t'はありません。 –

3

is_default_constructible<T>デフォルトのコンストラクタ(= default)は認識されません。 T()が有効な初期化(注:T{}ではない)かどうかは、がほとんどです。

最初の近似値は次のとおりです。

template<typename T, typename = void> 
struct is_default_constructible : std::false_type { }; 

template<typename T> 
struct is_default_constructible<T, std::void_t<decltype(T())>> : std::true_type { }; 

voidのために構築可能デフォルトけどvoid()が有効な式ですされていないため、追加的なニュアンスは、標準バージョンであります。

関連する問題