これで、(コンパイル時にわかっている)事前定義サイズの配列を表すユーザー定義の型に対して、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;
}
これを達成するための最良の方法はありますか?
あなたは 'initializer_list'を使用して必要か、またはそれは、中括弧を使用して初期化されている何か他のものになることができますか? – KyleKnoepfel
**中かっこ**の中かっこを使用すると、それ以外のものを使うことができます。全体的には、私は何も必要ありません。私は前述のクラスに類似した方法を実装し、** {} **(中かっこ)のすべてのタイプを使用するC++ 11のガイドラインに従います。初期化。 – rsht
Uh、クラスに2つの 'idx_t'を取るコンストラクタを与えてください。 'MatrixIdx idxIL {1、2};'構文でうまく呼び出されます。あなたはそれをあまりにも複雑にしています。 –