7

テンプレート クラスを作成していて、特定のテンプレート タイプに対してのみ追加のメソッドが存在できるようにしたいと考えています。現在、このメソッドはすべてのテンプレート タイプに存在しますが、他のすべてのタイプではコンパイル エラーが発生します。

これを複雑にしているのは、それがオーバーロードされた operator() であることです。私がやりたいことが実際にここで可能かどうかはわかりません。

これが私が今持っているものです:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);
    typename T const& operator() (const Utility2<BASE>& foo) const;
};

T&バージョンを常に利用できるようにしたいのですが、T const&バージョンが有効な場合にのみ利用できUtility2<BASE>ます。現在、両方の方法が存在しますが、const バージョンを使用しようとすると、Utility2<BASE>無効な場合に奇妙なコンパイル エラーが発生します。賢明なエラー、または「そのようなメンバー関数はありません」というエラーが発生することをお勧めします。

これは可能ですか?

編集:ブーストドキュメントを読んだ後、ここに私が思いついたものがありますが、うまくいくようです:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);

    template<typename U>
    typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const &
    operator() (const U& foo) const;
};

そのため、誰かが Utility2 で使用しようとしない限り、そのメソッドは存在せず、その BASE タイプに対して有効な場合にのみ Utility2 を作成できます。ただし、その BASE 型に対して有効でない場合、MyClass はアクセサー メソッドの作成に時間を浪費しません。

4

1 に答える 1

4

はい、これは可能ですが、クラス テンプレート パラメーターを直接使用することはできません。 boost::enable_ifメソッド自体のテンプレート パラメーターでのみ使用できます。したがって、少し typedef を使用すると、次のようになります。

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:
  typedef Utility2<BASE> util;

  typename T& operator() (const Utility1<BASE>& foo);

  template<typename U>
  typename boost::enable_if<boost::is_same<util, U>, T>::type const &
  operator() (const U& foo) const;
};

Utility2 は特定の BASE タイプからしか作成できないため、これは機能します。したがって、BASE 型がそれ以外の場合、const バージョンの operator() は存在しません。

ですから、それは非常に些細なことです。それは私をあまり得ません。でもやりかたはかっこよかった。

于 2011-02-23T23:46:43.210 に答える