【发布时间】:2019-03-19 16:06:59
【问题描述】:
我认为这会更容易;我有这样的一类:
template <int dim, int spacedim>
class FE_problem
{
//...
void generate_mesh();
}
我对那个成员函数generate_mesh 有一个特殊要求:
我需要它根据dim 和spacedim 的值 显式不同。
我做了几次尝试,例如:
template <int dim, int spacedim>
void FE_problem<1, 3>::generate_mesh()
{
...do a kind of mesh initialization ...
}
template <int dim, int spacedim>
void FE_problem<3, 3>::generate_mesh()
{
...do another kind of mesh initialization ...
}
但无法编译。
我尝试使用std::enable_if,但我仍然不太了解它是如何工作的,也不知道它是否正确。
为了避免(目前)我尝试使用宏的问题,在定义方法时使用以下代码:
#if DIM 1
template <int dim, int spacedim>
void FE_problem<dim,spacedim>::generate_mesh()
{
...do a kind of mesh initialization ...
}
#elif DIM 3
template <int dim, int spacedim>
void FE_problem<dim,spacedim>::generate_mesh()
{
...do another kind of mesh initialization ...
}
#endif
然后,在 main 函数中初始化类时,我尝试了类似的方法:
#define DIM 1
auto FE1 = FE_problem<1, 3>();
#undef DIM
#define DIM 3
auto FE2 = FE_problem<1, 3>();
#undef DIM
希望预处理器能做正确的替换,但结果是 DIM 结果未定义(在这两种情况下)。这是因为预处理器替换 DIM 的顺序吗?有解决办法吗?
【问题讨论】:
-
查找
template specialization。它应该告诉你你需要做什么。本质上(如果我没看错的话)您想为特定情况创建特殊版本的模板化代码。
标签: c++ templates c-preprocessor template-specialization