gpt4 book ai didi

c++ - 使用可变模板的维度无关类

转载 作者:太空宇宙 更新时间:2023-11-04 13:58:09 25 4
gpt4 key购买 nike

我有一个模拟二维和三维工程问题的科学图书馆。 2D 和 3D 代码非常相似,但是专门针对 2D 和 3D 问题手写的。例如一个简单的 point类在 2D 和 3D 中明确具有单独的实现。

我是c++11 的新手|但基于我所读到的内容,我决定测试新功能,以将这些代码无缝组合到一个维度无关的框架中。我的第一次尝试是编写一个简单的通用 point类如下:

#include <iostream>

template<unsigned short dim, typename T=double>
class point{
const T x[dim];

public:
template<typename... X>
point(X... xs): x{xs...}
{
static_assert(dim>0, "A point needs to at least have one component");
}

friend std::ostream& operator<<(std::ostream& os, const point<dim,T>& p)
{
os << "(";
for (unsigned short i=0; i<dim-1; i++)
os << p.x[i] << ", ";
os << p.x[dim-1] << ")" << std::endl;

return os;
}
};

int main(){
point<3> p = {3., 4.};
std::cout << p;
return 0;
}

除了我有两个问题/问题外,它工作正常。首先,为什么我需要模板参数 TX ?为什么我不能告诉编译器对可变构造函数使用相同的模板参数?对我来说,这似乎是一个合理的要求!

其次,如果我尝试过 point<2> p = {3, 5};我对此大吼大叫narrowing conversion of ‘xs#0’ from ‘int’ to ‘const double’ inside { } [-fpermissive] .为什么我不能从整数初始化 double ?我从没想过这是违法的。这是新的 c++11如果是这样,这里的解决方法是什么?

最佳答案

你可以使用 std::initializer_list并使用 std::vector而不是数组:

template<unsigned short dim, typename T=double>
class point{
static_assert(dim>0, "A point needs to at least have one component");
const std::vector<T> x;

public:
point(std::initializer_list<T> xs): x{xs}
{}

...
};

关于c++ - 使用可变模板的维度无关类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com