1

2 つのポリシー テンプレート パラメーターを受け取るクラスがあるとします。

template<typename PolicyA, typename PolicyB>
class widget;

次の使用可能なポリシー クラス A1、A2、A3、B1、B2、B3。1 と 2 は相互に互換性があるが、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

簡単な解決策は、互換性のないケースごとに特殊化を行い、コンパイルエラーをトリガーするものを含めることです。このようなもの:

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

長さ0のchar配列はコンパイラーをオフにし、「メッセージ」はコンパイルエラーのどこかに表示されます。

于 2012-10-13T01:01:56.897 に答える
0

特殊なテンプレートについては既にご存じのようですね。

とにかく、アイデアは、自動的にIncompatibleExceptionまたは何かをスローする互換性のない型に特化したテンプレートを定義することです。

したがって、技術的にはユーザーがタイプを定義できますが、それは使用できず、完全に明白です。

于 2012-10-13T00:51:20.647 に答える