模板类中的模板方法专门化

时间:2013-04-22 12:58:31

标签: c++ templates specialization

我需要(想要)专门化模板类中的方法,只允许某些基本类型。 (这不是this)的重复问题

我有这堂课:

template<typename TYPE, size_t NB>
class X
{
public:
   template<typename arg_type>
   X& get(const arg_type var);
}

我想专门化arg_type以仅允许无符号整数,如下所示:

template<typename TYPE, size_t NB> template<unsigned long> X& X::get(const unsigned long val);

但是可以肯定的是,上述内容在msvc2011和gcc

上都不起作用

更具体地说,我尝试做的是根据上面的模板化类型编写代码,并编写专门化,以便使用此类X的任何人都不能使用此方法而不是我专门的方法。

这甚至可能吗?如果是的话,这样做是不是很糟糕?

提前致谢, jav974

1 个答案:

答案 0 :(得分:4)

专业化不是你想要的。使用专门化,您可以使用无符号整数类型提供一种特殊的方法来处理模板方法的实例化,但没有什么可以阻止用户使用其他类型实例化它。

您可以使用SFINAE

来实现此目的
#include <type_traits>    

template<typename TYPE, size_t NB> 
class X
{
public:
    template<typename arg_type> 
    typename std::enable_if<std::is_unsigned<arg_type>::value, X&>::type  // arg_type is unsigned
    get(arg_type val) 
    {

    }
};

您还可以使用static_assert,以便用户收到更友好的错误消息:

template<typename arg_type> 
X& get(arg_type val) 
{
    static_assert(std::is_unsigned<arg_type>::value, "The argument should be unsigned!");
}

如果您希望TYPE模板参数遵循相同的规则,您还可以使用static_assert

template<typename TYPE, size_t NB> 
class X
{
public:
    static_assert(std::is_unsigned<TYPE>::value, "TYPE should be unsigned!");
};