首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++模板函数专门化

C++模板函数专门化
EN

Stack Overflow用户
提问于 2012-10-15 18:07:10
回答 3查看 2.6K关注 0票数 1

我必须为一个模板类实现一个非成员函数isHomogenous(三元组),其定义如下:

代码语言:javascript
运行
复制
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函数应返回一个布尔值,指示参数三元组中的所有三个值是否都属于同一类型。我试过了:

代码语言:javascript
运行
复制
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;
}

这不管用,你能提示我一个解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-15 18:15:18

函数模板不能部分专门化。

另一种方法是将其定义为静态成员函数(或者在本例中只定义一个值!)类模板,然后只提供一个普通函数模板包装器,如…

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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;
}
票数 8
EN

Stack Overflow用户

发布于 2012-10-15 18:15:28

您不能专门化模板函数,当您添加专门化时,专门化函数实际上被添加到重载集中,因此它与重载相同,并使用重载解析规则来选择调用哪个函数。

如果你真的想专门化一个模板函数,委托给一个具有静态成员的结构或类,然后专门化模板结构:

代码语言:javascript
运行
复制
template <typename T>
struct handler
{
   static void perform(T& );
};

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

下面是全局函数(您希望对其进行专门化):

代码语言:javascript
运行
复制
template <typename T>
void function (T& v)
{
   handler<T>::perform(v);
}

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-10-15 18:33:19

您可以使用函数部分专门化一个类,该函数将返回true或false。(或静态成员,等等):

代码语言:javascript
运行
复制
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> >()();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12893411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档