Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 11
1

Перегрузка оператора << для шаблона

26.04.2016, 21:22. Просмотров 310. Ответов 11
Метки нет (Все метки)


У меня есть структура студенты, а класс-шаблон массив элементов.
Как сделать оператор универсальным, подходящим для любых типов(и для инта, и для моей структуры и т. д.)?
спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2016, 21:22
Ответы с готовыми решениями:

Перегрузка оператора- для шаблона класса
Ребят подскажите что не так я делаю или подтолкните в нужное русло =\ З.Ы. Массивы будем...

Перегрузка оператора >> << для файлов
Здравствуйте. такая вещь, я перегрузил операторы записи и чтения в файл для текстового и двоичного...

Перегрузка оператора для класса
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ...

Перегрузка оператора + для стека
Добрый день. Прошу помощи с перегрузкой этой операции. Цель: перегрузить + так,чтобы он складывал...

11
10 / 10 / 10
Регистрация: 01.12.2014
Сообщений: 32
26.04.2016, 22:15 2
Если нужно хранить в ней только эту структуру и базовые типы, то что-то вроде этого:
C++
1
2
3
4
5
6
7
8
if (typeid(T) == typeid(TypeOfStruct))
{
    ... // Действия со структурой
}
else
{
    ... // Действия с другими типами
}
Либо в пользовательских типах реализовать перегрузку приведения типов в нужных классах:
C++
1
operator TypeName() { ... }
1
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 11
27.04.2016, 01:19  [ТС] 3
Хорошо) спасибо
0
С чаем беда...
Эксперт CЭксперт С++
8525 / 4243 / 1173
Регистрация: 18.10.2014
Сообщений: 9,211
27.04.2016, 03:41 4
Цитата Сообщение от Fantasma Посмотреть сообщение
Если нужно хранить в ней только эту структуру и базовые типы, то что-то вроде этого:
C++
1
2
3
4
5
6
7
8
if (typeid(T) == typeid(TypeOfStruct))
{
* * ... // Действия со структурой
}
else
{
* * ... // Действия с другими типами
}
Это как это вы собираетесь такое компилировать? Если T является "другим типом", то "действия со структурой" просто не будут компилироваться.

Не первый раз вижу попытки предложить такой совершенно не работоспособный подход. Откуда это идет, интересно?
1
avgoor
27.04.2016, 14:44
  #5

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда это идет, интересно?
Вероятно, это просто логично. constexpr if же.

0
10 / 10 / 10
Регистрация: 01.12.2014
Сообщений: 32
27.04.2016, 14:44 6
Ну вот маленький примерчик использования:
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
#include <iostream>
#include <string>
 
typedef struct
{
    std::string name;
    int age;
} Student;
 
template <class T>
class MySample
{
public:
    void doSomething(T val)
    {
        if (typeid(T) == typeid(Student))
        {
            std::cout << "It\'s Student\n";
            auto myStudent = static_cast<Student>(val);
            std::cout << myStudent.name << std::endl
                << myStudent.age << std::endl;
        }
    }
};
 
int main()
{
    Student myStudent;
    std::cout << "Press student name:\n";
    std::cin >> myStudent.name;
    std::cout << "Press student age: ";
    std::cin >> myStudent.age;
    MySample<Student> mySample;
    mySample.doSomething(myStudent);
    system("pause");
    return 0;
}
Компилируется, запускается и работает на "ура".
Однако, ясное дело, что с помощью перегрузки приведения типов будет куда удобнее и круче все это реализовать, да и к тому же с каждым новым классом не нужно добавлять код в класс-шаблон.
1
1224 / 744 / 167
Регистрация: 05.12.2015
Сообщений: 2,205
27.04.2016, 14:51 7
Цитата Сообщение от Fantasma Посмотреть сообщение
Компилируется, запускается и работает на "ура".
Попробуйте так:
C++
1
2
3
4
5
int main()
{
    MySample<int> s;
    s.doSomething(5);
}
2
10 / 10 / 10
Регистрация: 01.12.2014
Сообщений: 32
27.04.2016, 15:21 8
Хм, а вот это ни в какую не работает, как ни старался химичить с условием. Такое чувство, будто оно уже на этапе сборки подставляет тип вместо T. Извиняюсь, моя ошибка, думал это что-то вроде instanceof в Java.

Тогда наверное один вариант: перегрузить функцию под каждый нужный тип и вызывать ее в реализации перегрузки оператора <<.
0
1224 / 744 / 167
Регистрация: 05.12.2015
Сообщений: 2,205
27.04.2016, 15:22 9
Цитата Сообщение от Fantasma Посмотреть сообщение
Такое чувство, будто оно уже на этапе сборки подставляет тип вместо T
И называется это инстанцированием шаблона.
1
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 11
27.04.2016, 15:39  [ТС] 10
Спасибо)
я уже сделала метод вывода в структуре(ConsoleWrite()), а в классе при перегрузке << вызываю его.
Предусмотрено, что в других классах/структурах будет такой же метод
0
Эксперт С++
8407 / 3943 / 863
Регистрация: 15.11.2014
Сообщений: 8,891
27.04.2016, 18:35 11
Цитата Сообщение от Fantasma Посмотреть сообщение
Такое чувство, будто оно уже на этапе сборки подставляет тип вместо T
внезапно?
0
1224 / 744 / 167
Регистрация: 05.12.2015
Сообщений: 2,205
27.04.2016, 20:28 12
Цитата Сообщение от Natasha0210 Посмотреть сообщение
Предусмотрено, что в других классах/структурах будет такой же метод
А не проще перегрузить operator<<, и вызывать его, а не ConsoleWrite()?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2016, 20:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Перегрузка оператора + для структуры
У нас есть две строки S1, S2 .После выполнения S3 = S1 + S2 : 1)в S3 должны быть символы входящие...

Перегрузка оператора * и / для строки
Есть класс MyString нужно написать перезагрузку Операция *: должна вернуть новую строку, которая...

Перегрузка оператора += и = для очереди
Доброе утро! += - сложение очередей, а = присваивание. Просто мне нужно перегрузить -, а получается...

Перегрузка оператора для stl
Читаю книгу Аммерааля по stl. разбираю следующий пример. Кто-нибудь может объяснить как работает...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.