我有一个模板类,里面有模板方法,给出了两个模板参数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':非法使用显式模板参数
答案 0 :(得分:4)
因此,对于模板化类的模板成员的显式特化,有一些奇怪的事情。请参阅此question。
一种解决方法是使用辅助类
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;
};
可以找到更完整的考试here
答案 1 :(得分: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>();
}