我有一個模擬兩維和三維工程問題的科學庫。 2D和3D代碼非常相似,但專門用於2D和3D問題。例如,一個簡單的point
類明確地在2D和3D中具有不同的實現。使用variardic模板的與尺寸無關的類
我對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;
}
除了我有兩個問題/疑問,工作正常。首先,爲什麼我需要模板參數T
和X
?爲什麼不告訴編譯器爲variardic構造函數使用相同的模板參數?對我來說,這似乎是一個合理的要求!
其次,如果我曾嘗試point<2> p = {3, 5};
,我會在narrowing conversion of ‘xs#0’ from ‘int’ to ‘const double’ inside { } [-fpermissive]
處大聲喊叫。爲什麼不能從一個整數初始化一個double?我從來沒有想過這是非法的。這是新的c++11
,如果是這樣的解決方法是什麼?
'static_assert'在編譯時完成,所以你不需要在函數中使用它。 –
@JoachimPileborg Interetsing。感謝您的評論。 – GradGuy