2014-08-28 58 views
1

我刚拿到下构建一个编译器错误:是否可以对std :: min()进行类型转换?

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; 
+1

假设'PySequence_Fast_GET_SIZE'不会再回到负值,当然,你也可以提供一个明确的模板类型,而不是即'的std ::分钟',依靠隐式转换。虽然在这里没有什么区别,但你可能想要避免使用c风格的转换,但最好养成使用'static_cast'的习惯。 – user657267 2014-08-28 09:08:16

+3

'min'需要'const lvalue references',因此它们绑定到临时表。 – 2014-08-28 09:08:21

+0

奇怪的命名约定:'PySequence_Fast_GET_SIZE'。 – Nawaz 2014-08-28 09:08:41

回答

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); 
+0

谢谢!我特别喜欢我不知道的类型强制版本。 – Stefan 2014-08-28 09:16:31

0

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

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