Это делает то, что я думаю, что вы просите.Сложность кода во втором конструкторе гарантирует, что мы не будем копировать дополнительные значения, просто стереть их.
#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 : Отвечая на требование для списка инициализатора.
Если ваш компилятор предоставляет функции c ++ 11, вы можете инициализировать либо std::vector
, либо 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);
}