C++ c++;对于不同的目标,从尺寸t到uint32 t的无用施法
我有一些针对不同目标构建的代码。它还有一些传统的函数,它们采用uint32_t而不是size_t,当我想将size_t类型强制转换为uint32_t时,这很烦人,因为我们已经设置了警告级别(很多gcc警告) 下面是一个人为的例子:C++ c++;对于不同的目标,从尺寸t到uint32 t的无用施法,c++,gcc,static-cast,C++,Gcc,Static Cast,我有一些针对不同目标构建的代码。它还有一些传统的函数,它们采用uint32_t而不是size_t,当我想将size_t类型强制转换为uint32_t时,这很烦人,因为我们已经设置了警告级别(很多gcc警告) 下面是一个人为的例子: val32 = static_cast<uint32_t>(strings.size()); val64 = static_cast<uint64_t>(strings.size()); // ERROR val32=static_cast
val32 = static_cast<uint32_t>(strings.size());
val64 = static_cast<uint64_t>(strings.size()); // ERROR
val32=static_cast(strings.size());
val64=静态_转换(strings.size());//错误
根据这条曲线在哪个拱门上运行,上面两行中的一行将抱怨无用的施法警告(我们将其视为错误)。现在我知道有一些方法可以解决这个问题,比如,更改代码以获得大小\u t。。。但是,这不是我的问题。我的问题是,当出现这种情况时,我如何才能最好地解决这个问题
我提出了一个解决方案-但它需要变量的引用传递:
模板
如果不同,则转换为静态(const FROM&value)
{
如果constexpr(std::is_same_v)
返回值;
其他的
返回静态_cast(值);
}
现在这是可行的,但我觉得有更好的方法(也许是标准内置的,或者是我在这里所做的改进)
请参见此处的完整示例代码:
gcc警告标志的完整列表:-Wall-Wextra-Wpedantic-Wconversion-Wsign conversion-wunrecachable code-Wlogical op-Wshadow-Wmissing include dirs-wparentses-Wmisleading indentation-Werror-Wno psabi-Wno error=弃用声明-Wnon虚拟dtor-Wuseless cast-wdupplicated cond-Wnull dereference
注意:我不想删除无用的施法警告标志,因为它在其他地方很有用,这是一个很好的解决方案,而且它仍然可以有所改进
无符号
整数类型时,但我们想检查一下)。函数可以如下所示:
template<typename TO, typename FROM>
TO legacy_size_cast(FROM value)
{
static_assert(std::is_unsigned_v<FROM> && std::is_unsigned_v<TO>,
"Only unsigned types can be cast here!");
TO result = value;
return result;
}
这看起来可能不是非常有用的东西(谁将分配一个4GB对象?),但实际上,当您传递负偏移量时,它可能会捕获严重的错误,例如(uint64\u t)(-1)
。这实际上是一个巨大的正值,但它的行为就像算术中的-1
。。。除非您将其转换为uint32\u t
,然后再转换回uint64\u t
,否则它会突然停止,而断言将捕捉到这一点
我建议使用宏。 例如
然后,当您为某个搜索进行编译时,在编译标志中添加
-D some\u arch
。这是一个很好的解决方案,您可以添加一个断言,声明不会丢弃任何有意义的位。@n.1.8e9-where's-my-sharem。抱歉-我不理解断言部分,您能稍微解释一下吗?您可能只想处理整数类型,不是吗?您可以添加static\u cast(value)==value
。顺便说一下,您甚至不需要强制转换或if(std::is_same_v…
,TO result=value
的工作原理相同(对于未签名的类型)。按常量ref或按值不重要,它将被内联并完全优化。我的意思是,assert(static_cast(value)==value)
。
TO result = static_cast<TO>(value);
assert(result == value);
#ifdef SOME_ARCH
code
#else
other code
#endif