2016-12-01 8 views
8

ストラクチャードバインディングの記事をここではスキップしましたが、http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0144r0.pdfという構文を使用していますが、構文がどのタイプの構造体にバインドできるかを知ることはできませんでした。私の最高の推測は、構造体は集約型でなければならないということです。または、公のデータメンバーだけのもの。ストラクチャードバインディングはどんなタイプの構造体でも使用できます

これには何か注意が必要ですか?あなたがあなたのタイプのためにstd::tuple_sizestd::tuple_elementgetを専門にしたくない場合は

+0

ペアとタプルは、良い例、マップノードタイプのように見えます。 –

+0

@KerrekSB :)ええ、私はちょうど私が自分の構造体を持っている場合、彼らがバインドすることができますどのような構造体の種類の詳細についてもう少し理解するために探していた。 – Curious

+0

確かに。パブリックメンバーに依存したくない場合は、例えば、あなたの型に 'std :: get'と' std :: tuple_size'を特化することができます。 –

答えて

5

し、[dcl.decomp]が必要です。そうでなければ

Eの非静的データメンバのすべての公開としますEの直接メンバーまたは 公開ベースクラスE,Eの同一の曖昧さのないメンバーは、匿名のユニオンメンバーを持たず、 識別子リストの要素の数は、Eの非静的データメンバーの数と等しくなければならない。

本質的にすべてのデータメンバーは同じクラスで宣言する必要があり、すべて公開する必要があり、メンバー数と同じ数の名前を指定する必要があります。

+0

これはgcc/clangのバグ/適切な実装の欠如かもしれませんが、どちらのコンパイラにも構造体からコピー可能である必要があります - 私はコピーコンストラクタを持っていることを意味します。これについてコメントできますか?このQ/Aを文書化する価値があると思うなら、私はこれを質問として尋ねることができますか? – PiotrNycz

+0

@PiotrNycz:C++ 17が公開されるまで待つことをお勧めします。それは素晴らしい質問をするでしょう。 –

関連する問題