为异质宽度

时间:2015-07-11 19:52:40

标签: c++ c++11 min

我的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函数,该函数采用两种(可能是不同的)无符号类型,其返回类型是两种类型中较小的一种?

1 个答案:

答案 0 :(得分:4)

如果要显式转换为较小的那个,您应该告诉编译器:

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);
}