别名模板的专业化 C++11 中没有开销的最佳替代方案

Specialization of alias template best alternative without overhead in C++11

本文关键字:最佳 开销 方案 专业化 C++11 别名      更新时间:2023-10-16

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

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

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

[太长,无法评论]

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

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

我知道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