5

私は約std::is_podを知っています。しかし、それは単なる集約型以上のものをチェックします。または、std::is_podは、私たちができる最高のものですか?Tが集合型であるかどうかをチェックする方法は?

基本的に、私はthis用関数テンプレートを書きたい:

template <typename T> 
aggregate_wrapper<T> wrap(T&& x); 

Tが集合型である場合にのみ有効になっています。

+2

私は 'is_aggregate'を実際に応用することはできません。例えば。シリアライゼーションには役立ちません。 –

+1

あなたがタイプの形質を探している場合、たとえば'memcpy'は安全ですし、[' std :: is_trivially_copyable'](http://en.cppreference.com/w/cpp/types/is_trivially_copyable)が必要です。 – ildjarn

+2

@ Cheersandhth.-Alf [this](http://codereview.stackexchange.com/q/117744/70823)の 'wrap()'関数テンプレートを書いてみたいと思います。これは 'T'が集約タイプ。 – Lingxi

答えて

4

is_aggregateテンプレートを合成する方法はありません。集約初期化に何かが関与するかどうかのルールは、C++ 14のメタプログラミング技術(リフレクションサポートが必要です)では検出できません。

これがない一般的な理由は、明示的に必要がないことです。 your wrapperの場合であっても、一意の初期化構文を非集約に適用できるので、非集約型に適用する場合には、ハザードがほとんどありません。あなたはすべての変換を非explicitにしますが、これは巧妙なメタプログラミング/ enable_if体操で修正できるものです。

allocator::constructの中で最も便利な場所はTが集計の場合は集約初期化を使用し、そうでない場合は直接コンストラクタ呼び出しを使用します(「不均一」部分をかわすため) )。

+0

もう一度考えると、このように 'wrap()'を書くのは良い考えではないかもしれません。集約が与えられていると、ユーザーが 'aggregate_wrapper'などを' wrap(x) 'だけで作ろうとしているのかどうかは分かりません。 – Lingxi

関連する問題