繁体   English   中英

C ++模板功能专业化

[英]C++ template function specialization

我必须为定义为以下模板类实现一个非成员函数isHomogenous(Triple Triple):

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函数应返回布尔值,该布尔值指示参数三元组中的所有三个值是否均属于同一类型。 我努力了:

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;
}

这行不通,您能提示我解决方案吗?

功能模板不能部分专业化。

一种替代方法是将其定义为类模板的静态成员函数(或者在您的情况下只是一个值!),然后仅提供普通的函数模板包装器,例如…。

#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;
}

您不能对模板函数进行特殊化,添加特殊化后,实际上会将特殊化功能添加到重载集合中,因此它与重载相同,并且用于选择调用哪个函数来调用重载解析规则。

如果您确实要专门化模板函数,请委托具有静态成员的结构或类,并专门化模板结构:

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);
}

希望这可以帮助。

您可以使用能返回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> >()();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM