私は約std::is_pod
を知っています。しかし、それは単なる集約型以上のものをチェックします。または、std::is_pod
は、私たちができる最高のものですか?Tが集合型であるかどうかをチェックする方法は?
基本的に、私はthis用関数テンプレートを書きたい:
template <typename T>
aggregate_wrapper<T> wrap(T&& x);
T
が集合型である場合にのみ有効になっています。
私は約std::is_pod
を知っています。しかし、それは単なる集約型以上のものをチェックします。または、std::is_pod
は、私たちができる最高のものですか?Tが集合型であるかどうかをチェックする方法は?
基本的に、私はthis用関数テンプレートを書きたい:
template <typename T>
aggregate_wrapper<T> wrap(T&& x);
T
が集合型である場合にのみ有効になっています。
is_aggregate
テンプレートを合成する方法はありません。集約初期化に何かが関与するかどうかのルールは、C++ 14のメタプログラミング技術(リフレクションサポートが必要です)では検出できません。
これがない一般的な理由は、明示的に必要がないことです。 your wrapperの場合であっても、一意の初期化構文を非集約に適用できるので、非集約型に適用する場合には、ハザードがほとんどありません。あなたはすべての変換を非explicit
にしますが、これは巧妙なメタプログラミング/ enable_if
体操で修正できるものです。
allocator::construct
の中で最も便利な場所はT
が集計の場合は集約初期化を使用し、そうでない場合は直接コンストラクタ呼び出しを使用します(「不均一」部分をかわすため) )。
もう一度考えると、このように 'wrap()'を書くのは良い考えではないかもしれません。集約が与えられていると、ユーザーが 'aggregate_wrapper'などを' wrap(x) 'だけで作ろうとしているのかどうかは分かりません。 – Lingxi
私は 'is_aggregate'を実際に応用することはできません。例えば。シリアライゼーションには役立ちません。 –
あなたがタイプの形質を探している場合、たとえば'memcpy'は安全ですし、[' std :: is_trivially_copyable'](http://en.cppreference.com/w/cpp/types/is_trivially_copyable)が必要です。 – ildjarn
@ Cheersandhth.-Alf [this](http://codereview.stackexchange.com/q/117744/70823)の 'wrap()'関数テンプレートを書いてみたいと思います。これは 'T'が集約タイプ。 – Lingxi