4

コード:

class A {
  std::vector<int> x = {2,3};                 // x[0] = 2 and x[1] = 3
  std::vector<int> y = std::vector<int>(2,3); // x[0] = 3 and x[1] = 3 Too verbose!!  
};

std::vector<int>ブレース初期化子のみを使用するコンストラクター、または少なくとも同じ効果をもたらすより短いバージョンを呼び出すことができる方法はありますか?

繰り返したくないstd::vector<int>

4

2 に答える 2

6

使用できるハックはありますか?

あなたの唯一の目標が「明示的に」タイプを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-listinitializer-clause ... opt initializer-listinitializer-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の使用に固執しています。

確認のための前のハックを参照してくださいが、それほど明白ではないかもしれません。

于 2012-07-11T17:54:02.947 に答える
-2

夢のような解決策。

繰り返したくないだけならstd::vector、どうですか

class A
{
    auto y = std::vector<int>(2,3);
};

これは許可されていません、標準は(7.1.6.4)と言います[dcl.spec.auto]

autoタイプ指定子は、選択ステートメントまたは反復ステートメントの条件で、new-type-idtype-specifier-seqまたはnew-expressionのtype-idで、変数を宣言する際にも使用できます。 for-range-declaration、およびクラス定義のメンバー仕様内に表示される中括弧または等しいイニシャライザーを使用して静的データメンバーを宣言する場合。

おそらく、 brace-or-equal-initializer構文が非静的メンバーに追加されたときに、この行を更新するのを忘れていました。

于 2012-07-11T17:51:49.500 に答える