2016-08-17 19 views
-1

これで、(コンパイル時にわかっている)事前定義サイズの配列を表すユーザー定義の型に対して、C++のinitializer_listを使用するとしましょう。たとえば、行列のインデックス(行、列):定義済みサイズの配列のinitializer_list

#include <initializer_list> 
#include <algorithm> 
#include <assert.h> 

using idx_t = unsigned; 

class MatrixIdx { 
public: 
    MatrixIdx() : 
     _idx { 0, 0 } 
    {} 

    // this is how I'm able to use initializer list for now 
    // cons: 
    //  * run-time assertion 
    //  * additional header (algorithm) 
    //  * not in member initializer list (call me perfectionist) 
    // 
    MatrixIdx(std::initializer_list<idx_t> l) 
    { 
     assert(l.size() == 2); 
     std::copy(l.begin(), l.end(), _idx); 
    } 

    //I want to achive constructor similiar to this one 
    //Won't compile 
    // 
    //MatrixIdx(std::initializer_list<idx_t> l) : 
     //static_assert(l.size() == 2, "two elements expected") //compile time assertion 
     //_idx[0] (l[0]), 
     //_idx[1] (l[1]) 
    //{} 

    idx_t row() { return _idx[0]; } 
    void setRow(const idx_t i) { _idx[0] = i; } 

    idx_t col() { return _idx[1]; } 
    void setCol(const idx_t i) { _idx[1] = i; } 

private: 
    idx_t _idx[2]; 
}; 

int main(void) 
{ 
    MatrixIdx idx; //default - OKAY 

    //MatrixIdx idxIL { 1, 2 }; //this should compile 

    //this should emit human-readable compile-time error 
    //MatrixIdx idxILError { 1, 2, 3 }; 

    return 0; 
} 

これを達成するための最良の方法はありますか?

+2

あなたは 'initializer_list'を使用して必要か、またはそれは、中括弧を使用して初期化されている何か他のものになることができますか? – KyleKnoepfel

+0

**中かっこ**の中かっこを使用すると、それ以外のものを使うことができます。全体的には、私は何も必要ありません。私は前述のクラスに類似した方法を実装し、** {} **(中かっこ)のすべてのタイプを使用するC++ 11のガイドラインに従います。初期化。 – rsht

+4

Uh、クラスに2つの 'idx_t'を取るコンストラクタを与えてください。 'MatrixIdx idxIL {1、2};'構文でうまく呼び出されます。あなたはそれをあまりにも複雑にしています。 –

答えて

1

クレジットは@IgorTandetnikに行く必要があります。@IgorTandetnikは、OPのコメントと同じ回答を提供しました。


均一な初期化構文はちょうどタイプidx_tの二つの引数を受け取るコンストラクタを提供することで、あなたの状況に非常に簡単に採用することができます。

class MatrixIdx { 
public: 
    ... 
    MatrixIdx() : ... {} 
    MatrixIdx(idx_t, idx_t) : ... {} 
}; 

そして、あなたのメインのコードで:

int main() 
{ 
    MatrixIdx mat {}; // Okay 
    MatrixIdx mat {1,2}; // Okay 
    MatrixIdx mat {1,2,3}; // Error - no 3-arg. c'tor for MatrixIdx 
} 
+0

ありがとう!また、Igor Tandetnik *があなたよりも少し前に同じ情報でコメントを投稿していることを指摘することは公正だと思います。とにかく、** {} **が 'std :: initializer_list'を意味するという私の考えは間違っていたことは明らかです。 – rsht

+0

はい、@IgorTandetnikはこれに対するクレームを主張する必要があります。それに応じて私の投稿を調整します。 – KyleKnoepfel

関連する問題