gpt4 book ai didi

安全整数转换的 C++ 模板

转载 作者:可可西里 更新时间:2023-11-01 15:32:08 25 4
gpt4 key购买 nike

我正在尝试编写一个 C++ 模板函数,它将在不同整数类型、不同宽度和可能的有符号/无符号不匹配之间的转换中的整数溢出时抛出运行时异常。出于这些目的,我不关心从浮点类型到整数类型的转换,也不关心其他对象到对象的转换。我想这样做而不必编写大量特殊情况代码。这是我目前拥有的:

template< typename T, typename R > void safe_cast( const T& source, R& result )
{
// get the maximum safe value of type R
R rMax = (R) ~0;
if ( rMax < 0 ) // R is a signed type
{
// assume that we're on an 8-bit twos-compliment machine
rMax = ~( 0x80 << ( ( sizeof( R ) - 1 ) * 8 ) );
}

if ( ( source & rMax ) != source )
{
throw new IntegerOverflowException( source );
}

result = static_cast<R>( source );
}

这是否正确且有效?

编辑:出于各种原因,STL 不可用,所以我不能使用 std::numeric_limits,而来自 Boost 的任何东西都是正确的。

最佳答案

您可以使用 std::numeric_limits 以更优雅的方式获取任何基本类型的最小和最大安全值(以及大量其他信息)模板,例如std::numeric_limits<T>::max() .您需要包括 <limits> .

引用:http://www.cplusplus.com/reference/std/limits/numeric_limits/

关于安全整数转换的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/998571/

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