是否可以对std :: min()进行类型转换?

时间:2014-08-28 09:02:50

标签: c++

我刚刚遇到以下构造的编译器错误:

size_t N = 10;
size_t Ntransforms = std::min(PySequence_Fast_GET_SIZE(__transforms), N);

因为PySequence_Fast_GET_SIZE()实际返回Py_ssize_tstd::min()被定义为

template <class T> const T& min (const T& a, const T& b);

由于它采用相同类型的左值引用,我很惊讶我可以使用内联类型转换来修复它:

size_t Ntransforms = std::min((size_t)PySequence_Fast_GET_SIZE(__transforms), N);

这样好吗?如果是,它是否等同于显式代码:

size_t Ntransforms = PySequence_Fast_GET_SIZE(__transforms);
if (Ntransforms > N) Ntransforms = N;

2 个答案:

答案 0 :(得分:6)

std::min签名会强制使用相同类型的参数:

 template <class T> const T& min (const T& a, const T& b);

如果参数类型不同,则调用不明确。

但是,可以使用临时(例如由演员表达式代替)来代替参数,因为std::min需要const左值引用。

或者,您可以强制用于实例化std::min的类型:

std::min<std::size_t>(PySequence_Fast_GET_SIZE(__transforms), N);

答案 1 :(得分:0)

是的,你可以。但它等同于您指定的变体。您可以自由使用表格:

size_t Ntransforms = std::min(static_cast<size_t>(PySequence_Fast_GET_SIZE(__transforms)), N);