在模板类中进行模板方法特化

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


1
你为什么认为嵌套模板是最佳方案?虽然可以让它工作,但可能有更简洁的解决方案,比如不使用嵌套模板,只使用非模板重载... - David Rodríguez - dribeas
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!");
};

太棒了!!我不知道那个,非常感谢!!顺便说一下,类的“TYPE”也应该遵循相同的规则,在哪里放置这个检查?构造函数? - jav974

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接