Специализация псевдонима шаблона лучшая альтернатива без издержек в C ++ 11 - PullRequest
0 голосов
/ 24 октября 2018

Мне известно, что невозможно специализировать шаблон псевдонима.

Дело в том, что я часто нахожу следующий повторяющийся шаблон:

template<class Code, Code code>
struct BaseStruct;

enum MyCode {A,B,C};

template<MyCode code>
using MyStruct = BaseStruct<MyCode, code>;

template<> // Error not possible
struct MyStruct<MyCode::A>
  {
  };


template<> // Ok but too long to write
struct BaseStruct<MyCode, MyCode::A>
  {
  };

Иногда мне приходитсянаписать много специализаций, и BaseStruct может иметь другие параметры шаблона или, может быть, иметь длинное имя, поэтому идеальным будет использовать псевдоним, а затем специализировать его.

Что вы, ребята, делаете в этой ситуации?Я бы предпочел не использовать макросы или другие способы, которые привносят накладные расходы.

PS Я использую c ++ 11

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

[Слишком долго для комментария]

В зависимости от вашего варианта использования, наследование вместо шаблона псевдонима может работать, но это трудно сказать из вашего игрушечного примера.

template<class Code, Code code>
struct BaseStruct;

enum MyCode {A,B,C};

template<MyCode code>
struct MyStruct : BaseStruct<MyCode, code> {};

template<> struct MyStruct<MyCode::A> {};
template<> struct MyStruct<MyCode::B> {};
template<> struct MyStruct<MyCode::C> {};
0 голосов
/ 24 октября 2018

Я знаю, что макросы в стиле C искажают зло, но ... если проблема в том, что "слишком долго писать", то до C ++ 17 лучшее, что я могу себе представить, это определить макрос следующим образом

#define BSMacro(X) \
   template <>    \
   struct BaseStruct<MyCode, MyCode::X >

Ниже приведен полный рабочий пример C ++ 11

template<class Code, Code code>
struct BaseStruct;

enum MyCode {A,B,C};

template<MyCode code>
using MyStruct = BaseStruct<MyCode, code>;

#define BSMacro(X) \
   template <>    \
   struct BaseStruct<MyCode, MyCode::X >

BSMacro(A)
 { };

BSMacro(B)
 { };

BSMacro(C)
 { };

int main ()
 {
   MyStruct<A>  bsa;
   MyStruct<B>  bsb;
   MyStruct<C>  bsc;
 }

Очевидно, что начиная с C ++ 17, вы можете использовать auto (как указано Jarod42)

template <auto code>
struct BaseStruct 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...