Сообщение 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
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
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";
}