#include <iostream>
#include <type_traits>
#include <boost/type_traits.hpp>
template<typename T, typename U>
struct promote
{
private:
typedef typename std::conditional<(sizeof(T) > sizeof(U)), T, U>::type Bigger;
typedef typename std::add_const<Bigger>::type BConst;
public:
//because mingw4.6.2 do not implement std::add_reference
typedef typename boost::add_reference<BConst>::type type;
};
template<typename T, typename U>
auto max(T const &a, U const &b)->typename promote<T, U>::type
{
return a > b ? a : b;
}
int main(int argc, char *argv[])
{
std::cout<<max(3, 4.5)<<std::endl;
std::cout<<max(4.5, 3)<<std::endl;
return 0;
}
mingw4.6.2 的 std::max
template<typename T>
inline T const& max(T const &a, T const &b)
{
return a > b ? a : b;
}
这会给我警告信息
main.cpp:27:24:警告:返回对临时的引用 [默认启用]
main.cpp:27:24:警告:返回对临时的引用 [默认启用]
编译器是migw4.6.2,操作系统是win7 64bits
第二个版本,只支持标量类型
template<typename T, typename U>
struct promote
{
typedef typename std::conditional<(sizeof(T) > sizeof(U)), T, U>::type type;
};
template<typename T, typename U>
inline typename promote<T, U>::type max(T a, U b)
{
static_assert(std::is_scalar<T>::value, "inhomogeneous max only support scalar type");
static_assert(std::is_scalar<U>::value, "inhomogeneous max only support scalar type");
return a > b ? a : b;
}
另一个解决方案是使用 SFINAE 和 boost::mpl 来做一些“过载”。我想我会在实际情况下明确命名 std::max 的类型