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

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

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.12.2012, 14:08     Перегрузка оператора шаблонного класса в зависимости от типа #1
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через type_traits, но не выходит - не компилируется. Хочу перегрузить operator+= как для разных объектов класса так и для встроенных типов. Вот небольшой пример моего кода:
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
#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;
        }
    }
};
 
 
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 14:08     Перегрузка оператора шаблонного класса в зависимости от типа
Посмотрите здесь:

Перегрузка оператора вывода на консоль для шаблонного класса C++
Перегрузка operator<< для шаблонного класса C++
Перегрузка << , >> для шаблонного класса C++
C++ Определение типа члена шаблонного класса
Перегрузка операторов шаблонного класса дружественными функциями C++
C++ Хранение вектора экземпляров шаблонного класса неизвестного типа
C++ Перегрузка оператора << шаблонного класса
C++ Различное поведение конструктора шаблонного класса в зависимости от типа параметра
C++ Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
C++ Перегрузка оператора = в шаблоне класса
C++ Перегрузка оператора для класса
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
06.12.2012, 14:44     Перегрузка оператора шаблонного класса в зависимости от типа #2
Перегрузка?
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;
}
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.12.2012, 22:34  [ТС]     Перегрузка оператора шаблонного класса в зависимости от типа #3
Замучился уже с этими шаблонами. Нужен совет. Сделал еще серию перегруженных операторов + и += и застрял на выносе их за пределы класса. Вернее, проблема возникает только с дружественной функцией, если определять ее в классе, то все в порядке. Кто подскажет как ее определить за пределами класса?
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
 
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 +=(foo<U> const& rhs);                          // foo += foo
 
    template<typename U>
    foo & operator +=(U const& rhs);                               // foo += !foo
 
    template<typename U>
    foo operator +(foo<U> const& rhs);                             // foo + foo}
 
    template<typename U>
    foo operator +(U const& rhs);                                  // foo + !foo
 
    template<typename U>     //ЕСЛИ ОПРЕДЕЛИТЬ СДЕСЬ, ТО ВСЕ ВПОРЯДКЕ
    friend foo operator +(U const& lhs, foo const& rhs);            // !foo + foo
};
 
template<typename T> template<typename U>
foo<T>& foo<T>::operator +=(foo<U> const& rhs) {   // foo += foo
    m_somevalue += rhs.get();
    return *this;
}
 
template<typename T> template<typename U>
foo<T>& foo<T>::operator +=(U const& rhs) {        // foo += !foo
    m_somevalue += rhs;
    return *this;
}
 
 
template<typename T> template<typename U>
foo<T> foo<T>::operator +(foo<U> const& rhs) {   // foo + foo
    foo<T> temp(*this);
    temp += rhs;
    return temp;
}
 
template<typename T> template<typename U>
foo<T> foo<T>::operator +(U const& rhs) {        // foo + !foo
    foo<T> temp(*this);
    temp.m_somevalue += rhs;
    return temp;
}
 
template<typename T> template<typename U>   //ВОТ ТУТ  ПРОБЛЕМА
foo<T> operator +(U const& lhs, foo<T> const& rhs) {        // !foo + foo
    foo<T> temp(rhs);
    temp.m_somevalue += lhs;
    return temp;
}
 
int main()
{
    foo<int> a, b;
    foo<double> d;
    double doub = 10.2;
    a.show();       //10
    b.show();       //10
    d.show();       //10
    (a+=b).show();  //OK
    (a+=d).show();  //OK
    (a+=5).show();  //OK
    (a+b).show();   //OK
    (a+d).show();   //OK
    (a+10).show();  //OK
    //(10.2+d+15).show();
    //(doub+d+doub+a).show();
 
    system("pause");
    return 0;
}
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
06.12.2012, 22:44     Перегрузка оператора шаблонного класса в зависимости от типа #4
Вроде так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<typename T>
class foo {
   
   // ...
 
   template<typename V, typename U>
   friend foo<V> operator +(U const& lhs, foo<V> const& rhs);
 
   //..
};
 
// ...
 
template<typename V, typename U>
foo<V> operator +(U const& lhs, foo<V> const& rhs) {
   // ...
}
Добавлено через 1 минуту
И кстати, зачем её делать другом? Может просто:
C++
1
2
3
4
5
template<typename V, typename U>
foo<V> operator +(U const& lhs, foo<V> rhs) {
   rhs += lhs;
   return rhs;
}
DiffEreD
 Аватар для DiffEreD
1424 / 761 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.12.2012, 23:22  [ТС]     Перегрузка оператора шаблонного класса в зависимости от типа #5
gray_fox, реально помог.

Добавлено через 11 минут
C++
1
2
3
4
5
template<typename V, typename U>
foo<V> operator +(U const& lhs, foo<V> rhs) {
   rhs += lhs;
   return rhs;
}
Вот этот вариант тоже неплох, но аргумент передается по значению, а не по ссылке, так что я остановлюсь на предыдущем.
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
06.12.2012, 23:53     Перегрузка оператора шаблонного класса в зависимости от типа #6
yuron_477, так какая разница по сравнению с этим, например? Та же копия (temp), только ты её сам создаёшь внутри ф-ии:
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
2
3
4
5
6
template<typename T> template<typename U> //ВОТ ТУТ ПРОБЛЕМА
foo<T> operator +(U const& lhs, foo<T> const& rhs) { // !foo + foo
    foo<T> temp(rhs);
    temp.m_somevalue += lhs;
    return temp;
}
Yandex
Объявления
06.12.2012, 23:53     Перегрузка оператора шаблонного класса в зависимости от типа
Ответ Создать тему

Метки
зависимости, класса, оператора, Перегрузка, типа, шаблонного
Опции темы

Текущее время: 15:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru