Следующий фрагмент кода был взят из folly и проверяет, больше, чем другой во время компиляции.
#include <limits>
#include <type_traits>
template <typename RHS, RHS rhs, typename LHS>
bool greater_than_impl(
typename std::enable_if<
(rhs <= std::numeric_limits<LHS>::max()
&& rhs >= std::numeric_limits<LHS>::min()),
LHS
>::type const lhs
) {
return lhs > rhs;
}
template <typename RHS, RHS rhs, typename LHS>
bool greater_than_impl(
typename std::enable_if<
(rhs > std::numeric_limits<LHS>::max()),
LHS
>::type const
) {
return false;
}
template <typename RHS, RHS rhs, typename LHS>
bool greater_than_impl(
typename std::enable_if<
(rhs < std::numeric_limits<LHS>::min()),
LHS
>::type const
) {
return true;
}
template <typename RHS, RHS rhs, typename LHS>
bool greater_than(LHS const lhs) {
return greater_than_impl<
RHS, rhs, typename std::remove_reference<LHS>::type
>(lhs);
}
int test()
{
auto v = greater_than<int, 0, int>(0);
std::cout << v << std::endl;
return 0;
}
GCC 4.8.2 показывает ожидаемый результат компиляции, но Visual C++ 2013 выдает ошибку во второй функции шаблона greater_than_impl
:
C2995: шаблон функции уже определен
кажется, что перегрузка std::enable_if не была распознана, отсутствует ли в Visual C++ 2013 какая-либо функция SFINAE?
constexpr
дляnumeric_limits::max()
иmin()
, которых нет в VS2013. Это может сработать, если вы установите последнюю версию CTP, я считаю, что это добавляет некоторую поддержкуconstexpr
, но даже в этом случае маловероятно, что они обновили stdlib. Но я не понимаю необходимости в этом в любом случае; если у вас есть поддержкаconstexpr
, почему бы просто не реализовать ее, как здесь? Кроме того, C++14 добавляетconstexpr
кstd::greater::operator()
. - person Praetorian   schedule 25.02.2014