别名模板的专业化 C++11 中没有开销的最佳替代方案
Specialization of alias template best alternative without overhead in 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
[太长,无法评论]
根据您的用例,继承而不是别名模板可能有效,但很难从您的玩具示例中说出来。
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
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- 别名模板的专业化 C++11 中没有开销的最佳替代方案