Шаблон C ++: явное объявление значения функции-члена / избежание проблемы с макросами - PullRequest
0 голосов
/ 19 марта 2019

Я думал, что это будет легче;У меня есть класс такого рода:

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?Есть ли исправление для этого?

1 Ответ

3 голосов
/ 19 марта 2019

У вас почти есть это. Когда вы специализируете шаблон, а это не частичная специализация, вы не включаете никаких параметров шаблона. В результате код будет выглядеть как

template <int dim, int spacedim>
class FE_problem
{
public:
   void generate_mesh();
};

template <> // full specialization, leave template parameter blank as they are provided below
void FE_problem<1, 3>::generate_mesh()
//              ^^^^ specify the specialized types/values here  
{
    std::cout << "void FE_problem<1, 3>::generate_mesh()\n";
}

template <> // full specialization, leave template parameter blank as they are provided below
void FE_problem<3, 3>::generate_mesh()
//              ^^^^ specify the specialized types/values here  
{
    std::cout << "void FE_problem<3, 3>::generate_mesh()\n";
}

int main()
{
    FE_problem<1, 3>{}.generate_mesh();
    FE_problem<3, 3>{}.generate_mesh();
}

Какие выходы

void FE_problem<1, 3>::generate_mesh()
void FE_problem<3, 3>::generate_mesh()
...