使用できるハックはありますか?
あなたの唯一の目標が「明示的に」タイプを2回指定する必要がないことである場合decltype
、あなたはあなたの探求にいくらかの援助を提供するために使うことができます:
class Obj {
std::vector<int> v1 = decltype(v1) (2,3);
};
typedef
また、 /は1をあまりusing
入力する必要がない優れた方法であることを忘れないでください。
struct Obj {
using VInt = std::vector<int>;
// typedef std::vector<int> VInt;
VInt v = VInt (3,2);
};
1. しゃれは意図されていません
規格はそれについて何と言っていますか?
悲しいことに、標準では、クラスの本体内のメンバーの初期化について次のように述べています。
9.2/5クラスメンバー[class.mem]
メンバーは、brace-or-equal- initializerを使用して初期化できます。(静的データメンバーについては、9.4.2を参照してください。非静的データメンバーについては、12.6.2を参照してください)。
メンバーを初期化するときに何ができて何がうまくいかないかについてのヒントはすでに少しわかっていますが、100%確実にするには、中括弧または等しい初期化子が実際に何であるかを読み続ける必要があります。
8.5/1イニシャライザー[dcl.init]
..。
ブレースまたはイコールイニシャライザー:
=初期化句
braced-init-list
initializer-clause:
代入式
braced-init-list
initializer-list:
initializer-clause ... opt
initializer-list、initializer-clause ... opt
braced-init-list:
{初期化子リスト 、opt }
{}
上記のbraced-or-equal-initializerの仕様では、クラスの本体内でメンバーを初期化するときに、 initializer-clause=
と一緒に使用するか、それ自体を使用して、2つのオプションに直面することがわかりました。braced-init-list
上記は、これら2つのいずれかに要約されます。
struct Obj {
Type foo = Type (1,2,3); /* example of an initializer-clause */
Type bar {1,2,3}; /* example of a braced-init-list */
};
braced-init-listは素晴らしく見えます、それを使用しましょう!
コンストラクターのオーバーロードを1つでstd::vector<...>
受け入れるため、braced-init-listを使用して、2つの引数を取るコンストラクターを呼び出すことはできません。これは、代わりに、ベクターのコンテンツとして使用されるためです。std::initializer_list
(size_type count, const T& value)
したがって、initializer-clauseの使用に固執しています。
確認のための前のハックを参照してくださいが、それほど明白ではないかもしれません。