我知道不可能专门化别名模板。
事实是,我经常发现以下重复出现的模式:
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