Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Перегрузка оператора шаблонного класса в зависимости от типа - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Циклы с накоплением (Сколько километров спортсмен пробежит за семь дней?) http://www.cyberforum.ru/cpp-beginners/thread721449.html
Начав тренировку, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Сколько километров спортсмен пробежит за семь дней?
C++ Вычислить значение квадратов четных чисел натурального ряда от K до M. Вычислить значение квадратов четных чисел натурального ряда от K до M. http://www.cyberforum.ru/cpp-beginners/thread721446.html
C++ Cвести матрицу к треугольному виду
Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. С помощью допустимых преобразований свести матрицу к треугольному виду. Найти количество строк, среднее арифметическое...
C++ Динамический список
Здравствуйте. Помогите реализовать динамический список с такими функциями: Динамический список Конструкторы: по умолчанию, с параметрами и копирования. Деструктор. функции: вставка элемента из...
C++ Разработать программу, выполняющую простейшие арифметические операции. http://www.cyberforum.ru/cpp-beginners/thread721409.html
Разработать вспомогательную программу) выполняющую простейшие арифметические операции. Исходные данные вводятся как параметры переменных окружения
C++ Нужно массив находящийся в файле разбить на столбцы и вывести среднее Всем :senor: Дан массив в файле.txt такого вида: "2012/8/10 12:55:14.21",0,0,25.07,43.7,1.97,1006.02,1050.96,60.29,-309.29,484.4,-0.11,,25.81,11.86,,53,2.95 "2012/8/10... подробнее

Показать сообщение отдельно
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
06.12.2012, 14:44
Перегрузка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
// #include <type_traits>
 
template<typename T>
class foo
{
    T m_somevalue;
public:
    foo() : m_somevalue(10) {}
    T get() const {return m_somevalue;}
    void show() const {std::cout<<m_somevalue<<std::endl;}
 
//    template<typename U>
//    foo& operator+=(const U val) //foo+=foo or foo+=val(int, long, double)
//    {
//        if (std::is_class<U>::value)
//        {
//            m_somevalue+=val.get();
//            return *this;
//        }
//        else
//        {
//            m_somevalue+=val;
//            return *this;
//        }
//    }
 
    template<typename U>
    foo & operator +=(foo<U> const& rhs) {   // foo += foo
       m_somevalue += rhs.get();
       return *this;
    }
 
    template<typename U>
    foo & operator +=(U const& rhs) {        // foo += !foo
       m_somevalue += rhs;
       return *this;
    }
};
 
 
int main()
{
    foo<int> a, b;
    foo<long> d;
    a.show();       //10
    b.show();       //10
    d.show();       //10
    (a+=b).show();
    (a+=d).show();
    (a+=5).show();
 
    // system("pause");
    return 0;
}
Добавлено через 18 минут
Возможно ещё так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <type_traits>
#include <complex>
 
 
template<typename T>
class foo
{
    T m_somevalue;
public:
    foo() : m_somevalue(10) {}
    T get() const {return m_somevalue;}
    void show() const {std::cout<<m_somevalue<<std::endl;}
 
 
    template<typename U, typename = typename std::enable_if<std::is_convertible<U, T>::value>::type>
    foo & operator +=(foo<U> const& rhs) {   // foo += foo
       m_somevalue += rhs.get();
       return *this;
    }
 
    template<typename U, typename = typename std::enable_if<std::is_convertible<U, T>::value>::type>
    foo & operator +=(U const& rhs) {        // foo += !foo
       m_somevalue += rhs;
       return *this;
    }
};
 
 
int main()
{
    foo<int> a, b;
    foo<long> d;
    a.show();       //10
    b.show();       //10
    d.show();       //10
    (a+=b).show();
    (a+=d).show();
    (a+=5).show();
 
    // (a += foo<std::complex<float>>()).show();
    // (a += std::complex<float>(5., 0.)).show();
 
    // system("pause");
    return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru