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