gpt4 book ai didi

c++ - 为异质宽度的整数编写 std::min/std::max

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:29 24 4
gpt4 key购买 nike

我的 C++ 程序使用不同宽度的无符号整数来表示对可以表示的数据的约束。例如,我有一个大小为 uint64_t 的文件,我希望使用大小为 size_t 的缓冲区以 block 的形式读取它。 block 是缓冲区大小和(剩余)文件大小中较小的一个:

uint64_t file_size = ...;
size_t buffer_size = ...;
size_t chunk_size = std::min(buffer_size, file_size);

但这失败了,因为 std::min 要求两个参数具有相同的类型,所以我必须向上转换然后再向下转换:

size_t chunk_size = \
static_cast<size_t>(std::min(static_cast<uint64_t>)buffer_size, \
file_size));

这种转换应该是不必要的,因为很明显 min(size_t, uint64_t) 总是适合 size_t

我如何编写一个通用的 min 函数,它接受两个(可能不同的)无符号类型,并且其返回类型是两个类型中较小的一个?

最佳答案

如果你想显式转换为较小的,你应该告诉编译器:

std::min<smaller_type>(buffer_size, file_size)

这很明确,每个人都会明白您在做什么。我会坚持下去。您在通话时提供了所需的类型。这比每次都将它隐藏在某个函数模板后面更具可读性。

不过,考虑到潜在的溢出问题,您可以:

template <typename U, typename V>
using smaller_type = std::conditional_t<sizeof(U) < sizeof(V), U, V>;

template <typename U, typename V>
using larger_type = std::conditional_t<sizeof(V) < sizeof(U), U, V>;

template <typename U, typename V>
smaller_type<U, V> my_min(const U& u, const V& v) {
return std::min<larger_type<U, V>>(u, v);
}

关于c++ - 为异质宽度的整数编写 std::min/std::max,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361197/

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