gpt4 book ai didi

c++ - 如何强制对模板参数类型进行签名?

转载 作者:IT老高 更新时间:2023-10-28 12:40:00 25 4
gpt4 key购买 nike

我将使用以下示例来说明我的问题:

template<typename T>
T diff(T a, T b)
{
return a-b;
}

我希望这个模板函数只在类型 T 被签名时才有效。我能想到的唯一解决方案是对所有无符号类型使用 delete 关键字:

template<>
unsigned char diff(unsigned char,unsigned char) == delete;
template<>
unsigned char diff(unsigned char,unsigned char) == delete;

还有其他解决方案吗?

最佳答案

您可以使用 std::is_signed连同 std::enable_if :

template<typename T>
T diff(T a, T b);

template<typename T>
std::enable_if_t<std::is_signed<T>::value, T> diff(T a, T b) {
return a - b;
}

这里 std::is_signed<T>::valuetrue当且仅当 T已签名(顺便说一句,浮点类型也是 true,如果不需要,请考虑与 std::is_integral 结合使用)。

std::enable_if_t<Test, Type>std::enable_if<Test, Type>::type 相同. std::enable_if<Test, Type>Test 的情况下被定义为空结构是 false 并且作为一个只有 typedef type 的结构等于模板参数Type否则。

所以,对于有符号类型,std::enable_if_t<std::is_signed<T>::value, T>等于 T ,而对于 unsigned 它没有定义并且编译器使用 SFINAE 规则,因此,如果您需要为特定的非签名类型指定实现,您可以轻松地做到这一点:

template<>
unsigned diff(unsigned, unsigned)
{
return 0u;
}

一些相关链接:enable_if , is_signed .

关于c++ - 如何强制对模板参数类型进行签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44562383/

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