1

この質問は次のようになります。 すべてのサブクラスに対するc++テンプレートの特殊化テンプレート化され た関数の代わりに、クラステンプレートの基本クラスに基づいてさまざまなことを行う必要があるテンプレート化されたクラスのメンバー関数があります。

template<typename T>

class xyz
{
  void foo()
  {
     if (T is a subclass of class bar)
        do this
     else
        do something else
  }

}

boost::enable_ifのわかりやすいチュートリアルが見つかりませんでした。したがって、このマイナーな変更の構文を正しく取得できません

4

1 に答える 1

4

タグディスパッチを使用できます:

template <typename T> class   xyz  
{
  public:
  void foo()  
  {
     foo( typename boost::is_base_of<bar,T>::type());
  }

  protected:
  void foo( boost::mpl::true_ const& )
  {
    // Something
  }

  void foo( boost::mpl::false_ const& )
  {
    // Some other thing
  }
};

enable_ifは、適切なオーバーロードを選択する前に線形数のテンプレートインスタンス化を必要とするため、通常、タグディスパッチはenable_ifを使用するSFINAEよりも優れていることに注意してください。

C ++ 11では、これらのブーストメタ関数と同等のstd::を使用できます。

于 2012-04-28T07:03:51.460 に答える