2016-08-17 46 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

它可以是別的使用**捲曲**括號。總的來說,我不需要任何東西,我只是好奇如何能夠實現類似於上述類的smth,並跟上使用** {} **(花括號)的C++ 11準則來適用於所有類型的初始化。 – rsht

+4

呃,給你的班級一個構造函數帶兩個'idx_t's。它會被'MatrixIdx idxIL {1,2};'語法調用得很好。你讓它太複雜了。 –

回答

1

貸記應該去@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