2

我有一个模板类,其中包含一个模板方法,提供两个模板参数 T 和 U。该操作非常昂贵,并且在分析中显示为 CPU 时间的主要用途。我可以对其进行一些优化,但仅适用于 T == U (这很常见)的情况,但是我不确定这样做的语法......

有问题的类和方法如下所示:

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

Foo::bar 通常是从其他模板代码调用的,所以即使我创建了一个单独的方法(例如“T fastBar()const”),我也不知道 id 如何让其他模板代码尽可能调用该版本...

我试图为 T == U 创建一个明确的专业化,但 VC9 给了我错误

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

错误 C2768:“Foo::bar”:非法使用显式模板参数

4

2 回答 2

4

所以关于模板类的模板成员的显式特化有一些奇怪的事情。看到这个问题

一种解决方法是使用辅助类

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

一种可能性是用于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 回答