2

特定のテンプレート クラスをインスタンス化できる場合は、SFINAE パターンを使用してコードを実行したいと考えています。これを想像してみましょう:

//Only instantiable with types T for which T.x() is ok:
template <class T>
class TemplateClass
{
  T t;
public:
  void foo() { 
    t.x(); 
  }
}

template <class T>
class User
{
  void foo()
  { 
    "if TemplateClass<T> is ok then do something else do nothing" 
  }
}

どうすればそれができますか?

どうもありがとう!

編集:私が試したedA-qa mort-ora-yの答えに基づいています:

template <class T>
struct TemplateClass
{
    T t;
    void foo() { t.x(); }

    static const bool value = true;

};
struct A {};
struct B { void x() {} };

template <class T>
struct User
{
    template<typename M>
    typename boost::enable_if<TemplateClass<M> >::type func( ) 
    { 
        std::cout << "enabled\n";
    }

    template<typename M>
    typename boost::disable_if<TemplateClass<M> >::type func( ) 
    { 
        std::cout << "disabled\n";
    }


    void foo()
    {
        func<TemplateClass<T> >();
    }

};

User<A> a;
a.foo();

User<B> b;
b.foo();

しかし、これは「有効有効」を返します。私は何が欠けていますか?

4

1 に答える 1

1

boost/utility/enable_if.hppヘッダーと、関連するメタ/テンプレート プログラミング コードを確認する必要があります。

ここで最も簡単な方法は、foo 関数の 2 つのバージョン (両方ともテンプレート関数) を用意することです。関数の 1 つは enable_if 構造を使用し、もう 1 つは disable_if 構造を使用します。

ブースト Web サイトでより良い例を見つけることができると確信していますが、次のようなものです。

template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }

この関数は、Template が有効な型である場合にのみ定義されます。常にコンパイルする必要があるため、対応する関数が必要になります。これは、有効でない場合に呼び出す関数です。

template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }

1 つのテンプレート内で、このパターンで 2 つのメンバー関数を両方のテンプレート関数にせずに定義できるかどうかはわかりません。2 つのテンプレート関数を定義して、デフォルトのテンプレート パラメーターを T に設定できると思います。

それが少し役立つことを願っています。

于 2010-11-04T09:34:42.143 に答える