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

jav*_*974 5 c++ templates specialization

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

好吧,我有这个课程:

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

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

template<typename TYPE, size_t NB> template<unsigned long> X& X::get(const unsigned long val);
Run Code Online (Sandbox Code Playgroud)

但可以肯定的是,上述内容在msvc2011和gcc上都不起作用

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

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

在此先感谢,jav974

mfo*_*ini 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) 
    {

    }
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

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