2012-10-15 114 views
1

我要实现一个非成员函数isHomogenous(三重三重)为模板类定义为:C++模板函数专业化

template <typename T1, typename T2, typename T3> 
    class Triple 
{ 
public: 
    Triple() 
    { } 
    Triple(const T1 &a, const T2 &b, const T3 &c) : a(a), b(b), c(c) 
    { } 
... 

的isHomogenous函数应该返回指示布尔值是否所有的三个值的在参数triple中是相同类型的。我曾尝试过:

template <typename T> bool isHomogenous(Triple<T, T, T> triple) { 
    return true; 
} 

template <typename T1, typename T2, typename T3> bool isHomogenous(Triple<T1, T2, T3> triple) { 
    return false; 
} 

这不起作用,你可以提示我一个解决方案吗?

+1

为什么没有找到解决方案为两种类型,如'的std :: is_same <>'从C++ 11 BinaryTypeTrait在20.9.6.2),然后使用它的两倍(A&B,A&C)? –

回答

8

函数模板不能被部分专业。

一种选择是将其定义为一个静态成员函数(或者你的情况只是一个价值!)类模板,然后只需提供一个普通的函数模板的包装,像&hellip;

#include <type_traits> 

template< class T1, class T2, class T3 > 
struct Blah {}; 

namespace detail { 
    template< class T1, class T2, class T3 > 
    struct IsHomogenous { static bool const yes = false; }; 

    template< class T > 
    struct IsHomogenous< T, T, T > { static bool const yes = true; }; 
} // namespace detail 

template< class T1, class T2, class T3 > 
bool isHomogenous(Blah< T1, T2, T3 >) 
{ 
    return detail::IsHomogenous< T1, T2, T3 >::yes; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    wcout << boolalpha 
     << isHomogenous(Blah< double, char, void >()) << " " 
     << isHomogenous(Blah< int, int, int >()) 
     << endl; 
} 

,另一个方法是使用C++ 11 std::is_same

#include <type_traits> 

template< class T1, class T2, class T3 > 
struct Blah {}; 

template< class T1, class T2, class T3 > 
bool isHomogenous(Blah< T1, T2, T3 >) 
{ 
    using std::is_same; 
    return is_same< T1, T2 >::value && is_same< T2, T3 >::value; 
} 

#include <iostream> 
int main() 
{ 
    using namespace std; 
    wcout << boolalpha 
     << isHomogenous(Blah< double, char, void >()) << " " 
     << isHomogenous(Blah< int, int, int >()) 
     << endl; 
} 
2

不能专门的模板功能,当您添加一个专业化的专门功能实际上添加设置,使其与超载与重载相同,并且用于选择要调用哪个函数的重载解析规则。

如果你真的想专门的模板功能,委托给一个结构或类的静态成员,专门的模板结构来代替:

template <typename T> 
struct handler 
{ 
    static void perform(T&); 
}; 

template <> 
struct handler<int> 
{ 
    static void perform(int) { doStuff(); } 
}; 

这里是全局函数(要专注):

template <typename T> 
void function (T& v) 
{ 
    handler<T>::perform(v); 
} 

希望这会有所帮助。

0

你可以部分专业类与仿函数将返回true或false。 (或静态成员,等等):

template< class T1, class T2, class T3 > 
class Blah {}; 

template< class T> 
struct isHomogenous 
{ 
    const bool operator()() { return false; } 
}; 

template< template <typename,typename,typename> class T, class T1, class T2, class T3 > 
struct isHomogenous<T<T1,T2,T3>> 
{ 
    const bool operator()() { return false; } 
}; 



template< template <typename,typename,typename> class T, class T1> 
struct isHomogenous<T<T1,T1,T1>> 
{ 
    const bool operator()() { return true; } 
}; 

std::cout << isHomogenous< Blah<double, char, void> >()() << " " 
    << isHomogenous< Blah<int, int, int> >()();