Ada*_*ran 5 c++ static-cast implicit-conversion c++11
我使用第三方容器int来存储大小。我还使用 stl 容器size_t来存储大小。
我经常在我的代码中必须在同一个循环中使用两者,例如:
// vec is std::vector
// list is the third party container
assert(vec.size() == list.size()); // warning
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[i]; // warning
}
Run Code Online (Sandbox Code Playgroud)
因此,为了解决这个问题,我必须要么进行函数风格转换,有人告诉我这是变相的 C 风格转换。
// vec is std::vector
// list is the third party container
assert(int(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[int(i)];
}
Run Code Online (Sandbox Code Playgroud)
或者我可以采用每个人都推荐的更丑陋的解决方案。静态铸造。
// vec is std::vector
// list is the third party container
assert(static_cast<int>(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[static_cast<int>(i)];
}
Run Code Online (Sandbox Code Playgroud)
我真的不想static_cast。
inttosize_t还是size_tto int?谢谢。
operator==如果参数之一无符号,二元运算符(此处)将有符号整数转换为无符号整数。一个有符号的负整数会变成一个大的正整数。
容器元素计数不得为负数,以避免违反最小意外原则。因此,隐式转换必须是安全的。但请务必检查int size() const.
您可能希望保留隐式转换的语义并使用as_unsigned函数来避免强制转换并更好地传达意图:
#include <type_traits>
template<class T>
inline typename std::make_unsigned<T>::type as_unsigned(T a) {
return static_cast<typename std::make_unsigned<T>::type>(a);
}
Run Code Online (Sandbox Code Playgroud)
进而:
assert(vec.size() == as_unsigned(list.size()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1064 次 |
| 最近记录: |