C++ c++;对于不同的目标,从尺寸t到uint32 t的无用施法

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

我有一些针对不同目标构建的代码。它还有一些传统的函数,它们采用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(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


注意:我不想删除无用的施法警告标志,因为它在其他地方很有用,这是一个很好的解决方案,而且它仍然可以有所改进

  • 演员阵容和std::is___v没有必要。一个简单的赋值将做完全相同的事情(当使用
    无符号
    整数类型时,但我们想检查一下)。函数可以如下所示:

     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