【发布时间】:2015-09-30 09:48:33
【问题描述】:
我的 C++ 程序使用不同宽度的无符号整数来表达对可以表示哪些数据的约束。例如,我有一个大小为uint64_t 的文件,我希望使用大小为size_t 的缓冲区分块读取它。块是缓冲区大小和(剩余)文件大小中较小的一个:
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 函数,它采用两种(可能不同的)无符号类型,其返回类型是两种类型中较小的类型?
【问题讨论】:
-
我在某处有一个实现,但我认为它很糟糕......而且它是 GPL,我不愿意重新授权它以满足 SO 的要求。
-
挖掘出来并为那些可以使用 GPL3+ 的人提供一个要点:gist.github.com/o11c/0d5c10684d8fe713d7f3