【发布时间】:2021-06-03 09:13:25
【问题描述】:
我有一些针对不同目标构建的代码。它还有一些遗留函数使用 uint32_t 而不是 size_t - 当我想将 size_t 类型转换为它时,这很烦人 - 具有我们设置的警告级别(大量 gcc 警告)。
所以这是一个人为的例子:
val32 = static_cast<uint32_t>(strings.size());
val64 = static_cast<uint64_t>(strings.size()); // ERROR
根据运行在哪个拱上,上面两行之一将抱怨无用的强制转换警告(我们将其视为错误)。现在我知道有一些方法可以解决这个问题,将代码更改为 size_t ... 但是,这不是我的问题。我的问题是,当这种情况出现时,我怎样才能最好地解决这个问题。
我想出了一个解决方案 - 但它需要变量的引用传递:
template<typename TO, typename FROM>
TO static_cast_if_different(const FROM &value)
{
if constexpr (std::is_same_v<TO, FROM>)
return value;
else
return static_cast<TO>(value);
}
现在这行得通,但我觉得有更好的方法(也许内置在标准中 - 或者我在这里所做的改进)?
在此处查看完整的示例代码:https://godbolt.org/z/87hao1aTb
gcc 警告标志的完整列表:-Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -Wunreachable-code -Wlogical-op -Wshadow -Wmissing-include-dirs -Wparentheses -Wmisleading-indentation -Werror -Wno-psabi -Wno-error=deprecated-declarations -Wnon-virtual-dtor -Wuseless-cast -Wduplicated-cond -Wnull-dereference
注意:我不想删除 useless-cast 警告标志,因为它在其他地方很有用
【问题讨论】:
-
这是一个很好的解决方案并且您可以添加一个断言,即不会丢弃任何有意义的位。
-
@n.1.8e9-where's-my-sharem。抱歉 - 我不明白那个断言部分,你能稍微解释一下吗?
-
您可能只想处理整数类型,不是吗?
-
您可以添加
static_cast<TO>(value)==value。顺便说一句,您甚至不需要演员表或if (std::is_same_v...),TO result = value;也可以正常工作(在无符号类型的情况下)。通过 const ref 或通过 value 无关紧要,无论如何它都会被内联并完全优化掉。 -
我的意思是,
assert(static_cast<TO>(value)==value)。
标签: c++ gcc static-cast