これは私があなたが求めていると思うことをします。2 番目のコンストラクターのコードの複雑さにより、余分な値をコピーせず、単に消去することが保証されます。
#include <vector>
#include <algorithm>
#include <cassert>
// untested
template <std::size_t n>
struct Vector {
std::vector<float> coords;
Vector() : coords(n, 0.) {}
Vector(const std::vector<float>& crds)
: coords(crds.begin(),
crds.begin()+std::min(n, crds.size())) {
// resize() extends coords with 0.0 values
coords.resize(n);
}
};
int main () {
std::vector<float> v(3);
Vector<6> V(v);
assert(V.coords.size() == 6);
}
編集:説明された要件への対応:
#include <vector>
#include <algorithm>
#include <cassert>
// untested
template <std::size_t n>
struct Vector {
std::vector<float> coords;
Vector() : coords(n, 0.) {}
Vector(const std::vector<float>& crds)
: coords(crds) { }
};
int main () {
Vector<6> V1;
Vector<6> V2(std::vector<float>(3, 2.));
Vector<6> V3(std::vector<float>(10, 3.));
assert(V1.coords.size() == 6);
assert(V2.coords.size() == 3);
assert(V3.coords.size() == 10);
}
EDIT : 初期化子リストの要件に対応しています。
std::vector
コンパイラが c++11 機能を提供している場合は、 を使用して、またはVector
値のリストから初期化できますstd::initializer_list
。
#include <vector>
#include <algorithm>
#include <cassert>
#include <initializer_list>
// untested
template <std::size_t n>
struct Vector {
std::vector<float> coords;
Vector() : coords(n, 0.) {}
Vector(const std::vector<float>& crds)
: coords(crds) { }
Vector(std::initializer_list<float> list)
: coords(list) {}
};
int main () {
Vector<6> V1;
Vector<6> V2(std::vector<float>(3, 2.));
Vector<6> V3(std::vector<float>(10, 3.));
Vector<6> V4(std::vector<float> ({1, 2, 3, 4}));
Vector<6> V5({1, 2, 3, 4});
assert(V1.coords.size() == 6);
assert(V2.coords.size() == 3);
assert(V3.coords.size() == 10);
assert(V4.coords.size() == 4);
assert(V5.coords.size() == 4);
}