LINUX.ORG.RU

История изменений

Исправление AntonI, (текущая версия) :

Можно вопросов по коду?

template <typename T>
constexpr auto has_double_multiply(T* ) -> decltype(declval<T>() * 1.0, true) {
  return true;
}

template <typename T> constexpr bool has_double_multiply(...) { return false; }

ЕМНИП перегрузка с аргументами (…) имеет наинизший приоритет при разрешении (или как там оно называется), именно за счет этого оно и работает? А насколько нужен declval ?

 template <typename U = T,
            typename enable_if<has_double_multiply<U>(nullptr), int>::type = 0>
  U f(double y) const {
    return x * y;
  }

я не понимаю зачем вводить U (почему нельзя везде просто написать T), но без него не работает;-(

Исходная версия AntonI, :

Можно вопросов по коду?

template <typename T>
constexpr auto has_double_multiply(T* ) -> decltype(declval<T>() * 1.0, true) {
  return true;
}

template <typename T> constexpr bool has_double_multiply(...) { return false; }

ЕМНИП перегрузка с аргументами (…) имеет наинизший приоритет при разрешении (или как там оно называется), именно за счет этого оно и работает? А насколько нужен declvar ?

 template <typename U = T,
            typename enable_if<has_double_multiply<U>(nullptr), int>::type = 0>
  U f(double y) const {
    return x * y;
  }

я не понимаю зачем вводить U (почему нельзя везде просто написать T), но без него не работает;-(