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

C++

Войти
Регистрация
Восстановить пароль
 
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
#1

Специализации шаблона функции или перезагрузка - C++

04.09.2016, 16:46. Просмотров 300. Ответов 15
Метки нет (Все метки)

Доброго времени суток. Собственно, мою проблему можно увидеть в коде:
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 <vector>
using namespace std;
 
class A {};
vector<A*> List;
 
class B : public A
{
public:
    virtual void printB()
    {
        cout << "B" << endl;
    }
};
 
class B2 : public B
{
    void printB()
    {
        cout << "B2" << endl;
    }
};
class C : public A
{
public:
    virtual void printC()
    {
        cout << "C" << endl;
    }
};
class C2 : public C
{
    void printC()
    {
        cout << "C2" << endl;
    }
};
 
template<typename T>
T* AddObj();
 
template<>
B* AddObj<B>()
{
    List.push_back(new B); //Как мне быть если я захочу в массив добавить компонент не B, а B2
    return List[List.size() - 1];
}
 
template<>
C* AddObj<C>()
{
    List.push_back(new C); //Точно так же как и с B
    return List[List.size() - 1];
}
Неужели мне придётся каждый наследуемый класс явно специализировать для этой функции?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
avgoor
839 / 481 / 107
Регистрация: 05.12.2015
Сообщений: 1,375
04.09.2016, 18:19     Специализации шаблона функции или перезагрузка #2
C++
1
2
3
4
5
6
template<typename T>
T* AddObj()
{
    List.push_back(new T);
    return &List.back();
}
Не?
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
04.09.2016, 19:58  [ТС]     Специализации шаблона функции или перезагрузка #3
Нет, совсем не то.
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
04.09.2016, 20:08     Специализации шаблона функции или перезагрузка #4
Вроде всё то. Что не так?
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
04.09.2016, 20:29  [ТС]     Специализации шаблона функции или перезагрузка #5
Ради Бога, простите, я не правильно написал код проблемы. Вот так правильно:
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
#include <iostream>
#include <vector>
using namespace std;
 
class B
{
public:
    virtual void printB()
    {
        cout << "B" << endl;
    }
};
 
class B2 : public B
{
public:
    void printB()
    {
        cout << "B2" << endl;
    }
};
class C
{
public:
    virtual void printC()
    {
        cout << "C" << endl;
    }
};
 
class C2 : public C
{
public:
    void printC()
    {
        cout << "C2" << endl;
    }
};
 
vector<B*> ListB;
vector<C*> ListC;
 
 
template<typename T>
T* AddObj();
 
template<>
B* AddObj<B>()
{
    ListB.push_back(new B); //Как мне быть если я захочу в массив добавить компонент не B, а B2
    return ListB.back();
}
 
template<>
C* AddObj<C>()
{
    ListC.push_back(new C); //Точно так же как и с B
    return ListC.back();
}
int main()
{
    B2* TempB2;
    C2* TempC2;
    TempB2 = AddObj<B2>();
    TempC2 = AddObj<C2>();
 
    TempB2->printB();
    TempC2->printC();
 
    return 0;
}
avgoor
839 / 481 / 107
Регистрация: 05.12.2015
Сообщений: 1,375
04.09.2016, 21:35     Специализации шаблона функции или перезагрузка #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
maks242, Вы еще не уяснили для себя, что глобальные переменные - плохо, а уже в шаблоны лезете...
По теме: можно использовать SFINAE

C++
1
2
3
4
5
6
template<class T>
std::enable_if_t<std::is_base_of<A, T>::value, A*> addObj()
{...ListA}
template<class T>
std::enable_if_t<std::is_base_of<B, T>::value, B*> addObj()
{...ListB}
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
05.09.2016, 00:18  [ТС]     Специализации шаблона функции или перезагрузка #7
avgoor, Интересный вывод, но я создал абстракцию той проблемы, которая у меня на самом деле и чтобы не создавать еще тройку лишних классов я сделал именно так.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
05.09.2016, 00:21     Специализации шаблона функции или перезагрузка #8
Может стоит все таки разделить и спрятать контейнеры внутрь класса?

C++
1
2
3
4
5
6
7
8
9
template<typename Base>
class Storage
{
        template<typename T> 
        std::shared_ptr<T>  append();
 
    private:
        std::vector<std::shared_ptr<Base> >  objs_;
};
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
05.09.2016, 00:23  [ТС]     Специализации шаблона функции или перезагрузка #9
Avazart, У меня они спрятаны в другом классе, просто чтобы не мусорить в коде я их вынес.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
05.09.2016, 00:24     Специализации шаблона функции или перезагрузка #10
Ну тогда проблема не понятна.
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
05.09.2016, 00:27  [ТС]     Специализации шаблона функции или перезагрузка #11
Avazart, Дело в том, что мне нужно собирать в контейнеры экземпляры разных классов одной функцией. Чтобы так сделать, можно использовать явную специализацию и разных ход поведения для разных иерархий, но проблема в том, что для каждого типа приходиться использовать явную специализацию, а не одну для всей иерархии.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
05.09.2016, 00:30     Специализации шаблона функции или перезагрузка #12
Цитата Сообщение от maks242 Посмотреть сообщение
Неужели мне придётся каждый наследуемый класс явно специализировать для этой функции?
Т.е. А как вы хотели?
По любому класс нужно как то задекларировать/зарегистрировать. Можно макросом обвернуть что бы короче выглядело.. но суть то не поменяется.

Добавлено через 2 минуты
Цитата Сообщение от maks242 Посмотреть сообщение
Avazart, Дело в том, что мне нужно собирать в контейнеры экземпляры разных классов
Ну так логика где, разные классы - разные контейнеры - а следовательно и ф-ции.
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
05.09.2016, 00:33  [ТС]     Специализации шаблона функции или перезагрузка #13
Ну, например, я могу записать указатель на дочерний класс в контейнер который хранит указатели на родительский класс, но сделать так в шаблоне не могу, ибо я делаю это для разных иерархий и приходиться явно специализировать каждый тип, хоть и поведение для одной из иерархий одинаковое.
avgoor
839 / 481 / 107
Регистрация: 05.12.2015
Сообщений: 1,375
05.09.2016, 00:56     Специализации шаблона функции или перезагрузка #14
Цитата Сообщение от maks242 Посмотреть сообщение
хоть и поведение для одной из иерархий одинаковое.
Я ж вам написал, как специализировать шаблон функции для всей иерархии.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,945
Записей в блоге: 17
05.09.2016, 01:06     Специализации шаблона функции или перезагрузка #15
Правильно я понимаю хочется нечто вроде этого:

C++
1
2
3
4
5
6
7
8
9
Storage<BaseX, DerivedX1, DerivedX2, DerivedX3>   StorageX;
 
DerivedX1* dx1 = StorageX.append<DerivedX1>();
DerivedX2* dx2 = StorageX.append<DerivedX2>();
DerivedX3* dx3 = StorageX.append<DerivedX3>();
 
Storage<BaseY, DerivedY1, DerivedY2>   StorageY;
DerivedY1* dy1 = StorageY.append<DerivedY1>();
// ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2016, 01:12     Специализации шаблона функции или перезагрузка
Еще ссылки по теме:

Создание специализации шаблонной функции и задача на std::vector C++
C++ Ошибка при специализации шаблона
C++ Специализации шаблонов класса
Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа C++
C++ Тест по специализации шаблонов

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

Или воспользуйтесь поиском по форуму:
maks242
46 / 20 / 7
Регистрация: 01.11.2013
Сообщений: 237
Завершенные тесты: 2
05.09.2016, 01:12  [ТС]     Специализации шаблона функции или перезагрузка #16
avgoor, Вам спасибо, я просто объяснял Avazart, в чём состояла моя проблема.
Yandex
Объявления
05.09.2016, 01:12     Специализации шаблона функции или перезагрузка
Ответ Создать тему
Опции темы

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