5

我需要(想要)在模板类中专门化一个方法,只允许某些原始类型。(这不是这个重复的问题

好吧,我有这门课:

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

4

1 回答 1

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!");
};
于 2013-04-22T13:03:11.977 回答