我正在尝试使用模板实现矢量(在数学意义上)。我想在类中定义标准向量常量。我设法做了简单的常量(全零,全部)但我现在正在努力定义更难的单位向量(除了在给定索引处将一个组件设置为1之外的所有零)。
我还没有找到一种优雅的方式来做到这一点。以下是我想要定义的内容:
#include <iostream>
template<unsigned int tSize, typename tReal>
class Vector {
public:
template<unsigned int tIndex>
static const Vector msUnit;
inline Vector () {}
template<typename...tTypes>
inline Vector (tTypes...pVals) {
set(mReals, pVals...);
}
inline tReal operator[] (unsigned int pIndex) {
return mReals[pIndex];
}
inline const tReal operator[] (unsigned int pIndex) const {
return mReals[pIndex];
}
protected:
template<typename tType>
void set (tReal* pPtr, const tType pVal) {
*pPtr = pVal;
}
template<typename tType, typename...tTypes>
void set (tReal* pPtr, const tType pVal, const tTypes...pVals) {
*pPtr = pVal;
set(pPtr+1, pVals...);
}
tReal mReals [tSize];
};
int main() {
Vector<3,double> lVec = Vector<3,double>::msUnit<2>;
std::cout << "Vector: (" << lVec[0] << ", " << lVec[1] << ", " << lVec[2] << ")" << std::endl;
return 0;
}
但是我还没有找到定义msUnit
静态const成员模板的方法。
我试过了:
template<unsigned int tIndex, unsigned int tSize, typename tReal>
const Vector<tSize,tReal> Vector<tSize,tReal>::msUnit<tIndex>;
但编译器(clang
&amp; gcc
)抱怨:
prog.cc:43:48: error: nested name specifier 'Vector<tSize, tReal>::' for declaration does not refer into a class, class template or class template partial specialization
const Vector<tSize,tReal> Vector<tSize,tReal>::msUnit<tIndex>;
~~~~~~~~~~~~~~~~~~~~~^
prog.cc:43:54: error: expected ';' at end of declaration
const Vector<tSize,tReal> Vector<tSize,tReal>::msUnit<tIndex>;
^
;
prog.cc:43:54: error: expected unqualified-id
以下是此测试的实例:http://melpon.org/wandbox/permlink/AzbuATU1lbjXkksX
甚至可以在模板类中使用静态const模板变量成员吗?如果是这样的话?
我仍然需要找到一种为msUnit
模板提供初始值设定项的方法。
答案 0 :(得分:3)
你已经找到了如何取消你的msUnit的方式 - 你必须使用两个模板,即
template<unsigned tSize, typename tReal>
template<unsigned tIndex>
const Vector<tSize, tReal> Vector<tSize, tReal>::msUnit;
由于目前没有匹配的构造函数用于将第n个参数初始化为一个而所有其他参数初始化为零(我认为这没有意义),您可以使用自己的函数。由于您已经访问了班级的静态成员,因此您还可以访问完整的班级,因此您可以使用
template<unsigned int tSize, typename tReal>
class Vector {
public:
// ...
template<unsigned int tIndex>
static const Vector msUnit;
private:
static const Vector<tSize, tReal> createUnitVector(unsigned tIndex) {
Vector<tSize, tReal> v{};
v.mReals[tIndex] = tReal(1);
return v;
}
tReal mReals [tSize];
};
template<unsigned tSize, typename tReal>
template<unsigned tIndex>
const Vector<tSize, tReal> Vector<tSize, tReal>::msUnit{Vector::createUnitVector(tIndex)};
所以你已经拥有它,但是你用你班上给出的其他函数初始化你的向量。
您可以在这里进行现场演示:http://melpon.org/wandbox/permlink/5b7cgXTeqXZDoCRp