[英]C++ template arguments
我有一个制作矢量的模板。 默认构造函数分配n个相同的值元素。 第二个构造函数使用给定的参数创建一个向量。 由于第二个构造函数使用默认构造函数来定义向量,因此我只能给出有关此向量中有多少元素以及它们的值的参数。
public:
vector<float> coords;
Vector<n> (){
coords.assign(n, 0.0);
}
Vector<n> (vector<float> crds){
coords.assign(crds.size(),0.0);
}
理想情况下,第二个构造函数应该使用crds并检查它的大小。 然后分配零次数与crds的大小相同 。 如果大小为2,它的效果很好。但是如果大小大于或小于2,则会发出错误。
如果我得到这个工作,那么我会在crds中插入每个值并弹出不必要的零。 但目前我无法找到另一种解决方案。 +我没有找到任何其他适合我的矢量stl函数比分配更好。
我检查结果的代码是
Vector<2> v2 (vector<float>(2,3));
这就是我认为你要求的。 第二个构造函数中的代码复杂性确保我们不会复制额外的值,只是为了擦除它们。
#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::initializer_list
从值列表初始化std::vector
或Vector
。
#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); }
如果我理解你想做什么,只需使用标准的矢量构造函数就可以做你想要的:
#include <vector>
template <int N>
class Vector {
public:
std::vector<float> coords;
Vector ()
: coords(N, 0.0f)
{}
Vector (const std::vector<float> & crds)
: coords(crds)
{}
};
但是,正如其他人在评论中强调的那样,这似乎设计得很差(特别是,我无法理解为什么N
在两个构造函数中的作用都是如此不对称)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.