如何解决模板函数使用名称空间作为参数?
出于性能方面的考虑,我必须使用显式操作制作自己的向量,矩阵,张量等类。由于我仅使用2D或3D维度,因此我为每个维度使用名称空间定义了类。这是代码的简单草案:
namespace Dim2 {
class Vec {
public:
double components[2];
};
class Mat {
public:
double components[2][2];
};
}
namespace Dim3 {
class Vec {
public:
double components[3];
};
class Mat {
public:
double components[3][3];
};
}
因此,例如,如果需要3D向量,则调用Dim3::Vec newVec;
,然后可以执行针对3维进行优化的操作。
现在,假设我想使用这样的模板编写通用函数:
template<typename Vec,typename Mat>
void doSomething()
{
Vec v;
Mat m;
// Perform operations
}
那样,如果我想使用2D向量,则调用doSomething<Dim2::Vec,Dim2::Mat>();
,对于3D向量:doSomething<Dim3::Vec,Dim3::Mat>();
。
此解决方案也在this question中得到了解决,并且工作正常。问题是...“真实”代码不仅将具有向量和矩阵,而且还将具有无数其他结构:三阶张量,四阶张量,对称矩阵等。如果在函数中使用所有这些,则调用将像这样:
doSomething<Dim2::Vec,Dim2::Mat,Dim3::Tensor3,Dim3::Tensor4,Dim4:: SymMat,...>();
这太广泛了(很丑)。
为了简短起见,我真正想做的就是将名称空间作为模板参数。像这样:
template<typename Dim>
void doSomething()
{
Dim::Vec v;
Dim::Mat m;
Dim::Tensor3 t3;
Dim::Tensor4 t4;
Dim::SymMat symMat;
// Perform operations
}
那样,函数调用将简单为doSomething<Dim2>();
或doSomething<Dim3>();
。
但是,这样做会给我带来编译器错误,因为C ++不会让名称空间作为模板参数。我试图使用嵌套类(即Dim2
和Dim3
作为类,而不是名称空间)来做同样的事情,但是仍然出现编译器错误。
我该怎么做才能执行我想要的?你们有其他选择吗?
在此先感谢您,并对英语错误表示歉意。
解决方法
您可以使用类似类型特征的助手struct
来减少用于调用doSomething()
的参数数量。
namespace Dim2 {
class Vec {
public:
double components[2];
};
class Mat {
public:
double components[2][2];
};
struct Chooser
{
using Vec = Vec;
using Mat = Mat;
};
}
namespace Dim3 {
class Vec {
public:
double components[3];
};
class Mat {
public:
double components[3][3];
};
struct Chooser
{
using Vec = Vec;
using Mat = Mat;
};
}
template <typename Chooser>
void doSomething()
{
using Vec = typename Chooser::Vec;
using Mat = typename Chooser::Mat;
Vec v1;
Mat m1;
}
int main()
{
doSomething<Dim2::Chooser>();
doSomething<Dim3::Chooser>();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。