1

给定一个采用两个策略模板参数的类:

template<typename PolicyA, typename PolicyB>
class widget;

以及以下可用的策略类 A1、A2、A3、B1、B2、B3。如何传达 1s 和 2s 相互兼容但 A3 仅与 B3 兼容?也就是说,只允许以下实例化:

widget<A1, B1> w11;    // All valid.
widget<A1, B2> w12;
widget<A2, B1> w21;
widget<A2, B2> w22;
widget<A3, B3> w33;

// No other combination allowed.

我在专业化中使用 std::enable_if 的失败尝试遇到了编译错误:

template<typename A, typename B>
class<A3, enable_if<is_same<B, B3>::value, B3>::type>
{};
4

3 回答 3

1
class A1; class A2; class A3; class B1; class B2; class B3;

/// Generic type
template <typename T1, typename T2>
class widget
{
  static_assert(std::is_same<T1, A3>::value ^ !std::is_same<T2, B3>::value,
    "Incompatible policy types selected.");
};

/// Some specialization
template <>
class widget<A1, A2>
{
};

widget<A1, B1> w11;
widget<A1, B2> w12;
widget<A2, B1> w21;
widget<A2, B2> w22;
widget<A3, B3> w33;
//widget<A1, B3> w13; // error C2338: Incompatible policy types selected.
//widget<A3, B2> w32; // error C2338: Incompatible policy types selected.
于 2012-10-13T01:38:03.317 回答
0

听起来您已经了解专用模板

无论如何,一个想法是为不兼容的类型定义一个专门的模板,自动抛出一个IncompatibleException或一些东西。

所以从技术上讲,用户可以定义类型,但它是不可用且完全显而易见的。

于 2012-10-13T00:51:20.647 回答
0

简单的解决方案是对每个不兼容的情况进行专门化,并让它包含一些会触发编译错误的东西。像这样的东西:

template <>
class widget<A1, B3> {
  char error__policies_A1_and_B3_are_incompatible[0];
};

长度为 0 的 char 数组会使编译器关闭,“消息”将出现在编译错误的某处。

于 2012-10-13T01:01:56.897 回答