Я думал, что это будет легче;У меня есть класс такого рода:
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?Есть ли исправление для этого?