gpt4 book ai didi

c++ - 模板类中的模板方法特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:29 25 4
gpt4 key购买 nike

我需要(想要)在模板类中专门化一个方法,只允许某些原始类型。 (这不是 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

最佳答案

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

您可以使用一些 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!");
};

关于c++ - 模板类中的模板方法特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com