这可以满足我的要求。第二个构造函数中的代码复杂性确保我们不会复制额外的值,只是为了擦除它们。
#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);
}
编辑:响应初始化列表的要求。
如果您的编译器提供 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);
}