如果我将Windows min / max宏编写为模板函数,那么正确的方法是什么?
min宏定义为:
#define min(a, b) (((a) < (b)) ? (a) : (b))
我想一个替代方案就是:
template <typename T, typename U, typename R = std::common_type_t<T, U>>
constexpr R min(T const& a, U const& b) {
return std::min(static_cast<R>(a), static_cast<R>(b));
}
这是正确的和/或具有完全相同的行为吗?
std :: min无法使用,因为它希望两个参数的类型相同。 http://en.cppreference.com/w/cpp/algorithm/min
答案 0 :(得分:1)
假设值<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='original'></div>
<div id='result'></div>
和a
是算术类型,您可以这样做:
b
但请注意,使用此功能会带来隐藏模型的缺点,并且返回类型并不明显。例如,混合有符号和无符号参数可能会导致错误,如果您不小心和故意。
一般情况下,我会建议只使用#include <type_traits>
template <typename T, typename U>
constexpr auto min(T a, U b) -> typename std::common_type<T, U>::type {
// This is a lot cleaner in C++14 where we can use std::common_type_t and local
// variables in a constexpr function. Alternatively, you could just implement
// this by casting a and b to their common type and calling std::min.
return static_cast<typename std::common_type<T, U>::type>(a) <
static_cast<typename std::common_type<T, U>::type>(b) ?
static_cast<typename std::common_type<T, U>::type>(a) :
static_cast<typename std::common_type<T, U>::type>(b);
}
并根据需要转换类型(例如,如果std::min
为a
且int
为浮点数,则执行{{1 }})。