Информация об изменениях

Сообщение Re: Разрешение перегрузки VC++ 15.5.4 от 20.01.2018 22:14

Изменено 20.01.2018 22:16 rg45

Re: Разрешение перегрузки VC++ 15.5.4
Здравствуйте, Kazmerchuk Pavel, Вы писали:

KP>Код ниже перестал работать после последнего апдейта студии до версии 15.5.4.

KP>Проверил на http://rextester.com VC еще компилирует, GCC нет. Видимо раньше VC был не прав.
KP>Как правильно написать такую перегрузку?
KP>p.s. вариант void (max)(double scalar, M const& a) не предлагать

Ну стандартно же:

https://ideone.com/VeIg1I

#include <iostream>
#include <type_traits>

template <typename, typename, typename = void>
struct Max;

template<typename L, typename R>
void (max)(L const& a, R const& b) {
  Max<L, R>()(a, b);
}

template<typename L, typename R, typename>
struct Max {
  void operator()(L const& a, R const& b) const {
    std::cout << "void (max)(L const& a, R const& b)" << std::endl;
  }
};

template<typename M>
struct Max<typename M::value_type, M> {
  void operator()(typename M::value_type scalar, M const& a) const {
    std::cout << "void (max)(typename M::value_type scalar, M const& a)" << std::endl;
  }
};

template<typename T, typename U>
struct EmptyBase {

    typedef T value_type;
    typedef U this_type;
};

template<typename T>
struct Matrix : public EmptyBase<T, Matrix<T> >  {
    
};

int main()
{
    Matrix<double> m;
    double s;    
    max(s, m);
    max(s, 42);
    
    std::cout << "Hello, world!\n";
}
Re: Разрешение перегрузки VC++ 15.5.4
Здравствуйте, Kazmerchuk Pavel, Вы писали:

KP>Код ниже перестал работать после последнего апдейта студии до версии 15.5.4.

KP>Проверил на http://rextester.com VC еще компилирует, GCC нет. Видимо раньше VC был не прав.
KP>Как правильно написать такую перегрузку?
KP>p.s. вариант void (max)(double scalar, M const& a) не предлагать

Ну стандартно же:

https://ideone.com/VeIg1I

#include <iostream>

template <typename, typename, typename = void>
struct Max;

template<typename L, typename R>
void (max)(L const& a, R const& b) {
  Max<L, R>()(a, b);
}

template<typename L, typename R, typename>
struct Max {
  void operator()(L const& a, R const& b) const {
    std::cout << "void (max)(L const& a, R const& b)" << std::endl;
  }
};

template<typename M>
struct Max<typename M::value_type, M> {
  void operator()(typename M::value_type scalar, M const& a) const {
    std::cout << "void (max)(typename M::value_type scalar, M const& a)" << std::endl;
  }
};

template<typename T, typename U>
struct EmptyBase {

    typedef T value_type;
    typedef U this_type;
};

template<typename T>
struct Matrix : public EmptyBase<T, Matrix<T> >  {
    
};

int main()
{
    Matrix<double> m;
    double s;    
    max(s, m);
    max(s, 42);
    
    std::cout << "Hello, world!\n";
}