2

テンプレートメソッドを含むテンプレートクラスがあり、2つのテンプレートパラメーターTとUを指定しています。この操作は非常にコストがかかり、プロファイリングでCPU時間の主な用途として表示されます。私はそれをいくらか最適化することができましたが、T == U(これはかなり一般的です)の場合に限りますが、これを行うための構文はわかりません...

問題のクラスとメソッドは次のようになります。

template<typename T>class Foo
{
public:
    ...
    template<typename U>U bar()const;
};

Foo :: barは通常、他のテンプレートコードから呼び出されるため、別のメソッド( "T fastBar()const"など)を作成したとしても、他のテンプレートコードで可能な場合はそのバージョンを呼び出す方法がわかりません。 ..。。

T == Uの明示的な特殊化を作成しようとしましたが、VC9でエラーが発生しました

template<typename T>template<>T Foo<T>::bar<T>()const

エラーC2768:'Foo :: bar':明示的なテンプレート引数の不正使用

4

2 に答える 2

4

したがって、テンプレート化されたクラスのテンプレートメンバーの明示的な特殊化には奇妙なことがいくつかあります。この質問を参照してください。

回避策の1つは、ヘルパークラスを使用することです。

template< typename T, typename U>
struct FooDispatchHelper
{
   static U dispatch( const Foo<T> * f )
   {
     return f->template bar_internal<U>();
   }
};

template< typename T >
struct FooDispatchHelper<T,T>
{
   static T dispatch( const Foo<T> * f )
   {
     return f->bar_fast();
   }
};

template<typename T>class Foo
{
public:
...
   template<typename U>U bar() const
   {
      return FooDispatchHelper<T,U>::dispatch( this );
   }

  template<typename U> U bar_internal() const;
  T bar_fast() const;

};

より完全な例はここにあります

于 2010-01-27T23:05:26.967 に答える
2

1つの可能性はboost::enable_if / disable_if、特定のインスタンス化に使用できるバージョンを選択するために使用することです。

#include <iostream>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits.hpp>

template <class T>
class Foo
{
public:
    template <class U>
    typename boost::disable_if<boost::is_same<T, U>, U>::type bar() const
    { std::cout << "Different U\n"; return U(); }

    template <class U>
    typename boost::enable_if<boost::is_same<T, U>, U>::type bar() const
    { std::cout << "Same U\n"; return U(); }
};


int main()
{
    Foo<int> f;
    f.bar<int>();
    f.bar<float>();
}
于 2010-01-27T23:52:58.700 に答える