1

我知道不可能专门化别名模板。

事实是,我经常发现以下重复出现的模式:

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

4

2 回答 2

2

[评论太长了]

根据您的用例,继承而不是别名模板可能会起作用,但是从您的玩具示例中很难说。

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> {};
于 2018-10-24T10:05:13.897 回答
1

我知道 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 
于 2018-10-24T09:41:34.280 回答