Windows MAX / MIN宏作为模板

时间:2017-10-11 03:05:23

标签: c++ c++11

如果我将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

1 个答案:

答案 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::minaint为浮点数,则执行{{1 }})。