除预处理程序外,如何有条件地启用/禁用显式模板实例化?

考虑:

template <typename T> struct TheTemplate{ /* blah */ };

template struct TheTemplate<Type1>;
template struct TheTemplate<Type2>;
template struct TheTemplate<Type3>;
template struct TheTemplate<Type4>;

在某些编译条件下,Type3与Type1相同,Type4与Type2相同。发生这种情况时,我会收到一个错误消息。我想检测类型相同,而不是像在类型3和类型4上实例化
// this does not work
template struct TheTemplate<Type1>;
template struct TheTemplate<Type2>;
template struct TheTemplate<enable_if<!is_same<Type1, Type3>::value, Type3>::type>;
template struct TheTemplate<enable_if<!is_same<Type2, Type4>::value, Type4>::type>;

我改用了enable_if和SFINAE(而且我相信我知道为什么它们会失败),但只有预处理器起作用了(嗯)。我正在考虑将类型放入元组或可变参数中,删除重复项,然后将其余部分用于实例化。

有没有一种方法可以根据模板参数类型有条件地启用/禁用显式模板实例化?

最佳答案

template <typename T> struct TheTemplate{ /* blah */ };

template<int> struct dummy { };

template struct TheTemplate<Type1>;
template struct TheTemplate<Type2>;
template struct TheTemplate<conditional<is_same<Type1, Type3>::value, dummy<3>, Type3>::type>;
template struct TheTemplate<conditional<is_same<Type2, Type4>::value, dummy<4>, Type4>::type>;

这仍然会产生四个显式实例化,但是在Type3Type1相同的情况下,它们不会重复(除非Type1dummy<3>!)

关于c++ - 条件显式模板实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13925730/

10-16 05:09