首页 > 解决方案 > 在 C++11 中没有开销的别名模板最佳替代方案的专业化

问题描述

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

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

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

标签: c++c++11templatestemplate-specializationtemplate-aliases

解决方案


[评论太长了]

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

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> {};

推荐阅读