【发布时间】:2018-11-06 15:36:35
【问题描述】:
出于性能原因,我使用带有枚举的模板类而不是继承继承(这不是一个选项)。
此时我有类似的东西:
typedef enum { A, B, C, D } QueueType;
template <QueueType T> class Queue {
Queue(int a){...} // only usable when T = A
Queue(unsigned a, unsigned b){...} // only usable when T = B || T = C
Queue(somestruct z){...} // only usable when T = B || T = C
//other constructors
}
现在,如果为已定义的 T 调用不兼容的构造函数,我会使用大量令人讨厌的 ifs/switches 来处理 T 并引发异常。
我想要的是使用std::enable_if 或等效项来防止在构造函数上抛出异常并在编译时检测此类错误。
我尝试了许多堆栈溢出和外国网站std::enable_if 示例,但我几乎无法理解我真正在做什么,并且总是以编译错误结束。
在此先感谢您提出一个可能回答得很琐碎的问题。我是模板的菜鸟。
环境:Linux GCC 8 和 c++14 限制:没有虚拟方法的最大性能。
【问题讨论】:
-
你能把你的尝试和你得到的错误一起展示吗?
-
Queue(int a, std::enable_if_t<T == A>* = nullptr){...} // only usable when T = A呢?你试过了吗? -
@PiotrNycz ,不完全是,因为我一直尝试将它放在模板上而不是作为参数。
-
是什么阻止您使用继承?因为如果仅仅是继承以某种方式使事情变慢的想法,您可能会发现编译器比您认为的要聪明。喜欢以直截了当的方式写东西。你未来的自己会感谢你。
-
@AndreKostur 我必须以每秒数百万的速度处理数据包。每个 if/branch 都很重要,即使缓存/分支预测是如何做出的。如果你必须考虑虚方法并解决它们,在这种情况下就太简单了。当然,这并不是说继承不好或类似的东西,而且,我们在其他地方使用它们,但是在关键性能点上,仅仅几个内存访问或分支就可以让我们损失一些 gigabit/s/per core跨度>
标签: c++ templates c++14 sfinae enable-if