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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
NikitoZZZ
4 / 4 / 1
Регистрация: 28.09.2013
Сообщений: 152
#1

Как описать шаблонную переменную в классе, тип которой заранее неизвестен ? - C++

24.09.2015, 21:48. Просмотров 328. Ответов 7
Метки нет (Все метки)

В классе имеется поле с данными. Мне нужно, чтобы эти данные были типа vector или типа forward_list в зависимости от ситуации. Как это реализовать ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2015, 21:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как описать шаблонную переменную в классе, тип которой заранее неизвестен ? (C++):

Как описать переменную в классе, тип которой заранее неизвестен? - C++
Есть класс , в кот куча всяких методов, все работает, все хорошо. Но есть одно большле НО, у объектов порожденным этим классом заранее...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе - C++
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...

Шаблоны, древовидная сортировка: как правильно передавать тип в шаблонную функцию? - C++
Реализую собственную версию древовидной сортировки на основе шаблонов. Нужно сравнение производить по объект функции. Тип шаблона -...

Описать переменную круг, в которой содержатся все дан* ные для построения круга в декартовой системе координат - C++
Описать переменную круг, в которой содержатся все дан* ные для построения круга в декартовой системе координат. а) Определить...

Описать шаблонную функцию в cpp-файле - C++
файл h template < class T > class B_tree { private: struct T_node { friend class B_tree; T val;

Как вернуть обьект тип которого заранее неизвестно - C++
решил поучить паттерны, застрял малость на одном, а точнее на его реализации, паттер называеться Вариант, смысл его, убрать типизацию... ...

7
nmcf
5783 / 5094 / 1743
Регистрация: 14.04.2014
Сообщений: 20,855
24.09.2015, 21:57 #2
Ситуация какая? Это на этапе компиляции определяется или в процессе работы программы?
0
NikitoZZZ
4 / 4 / 1
Регистрация: 28.09.2013
Сообщений: 152
24.09.2015, 21:58  [ТС] #3
C++
1
2
3
4
5
template <typename Type, typename Policy> class Cointainer {
    ...
private:
    std::vector <Type> data;
};
Вот тут мне иногда может понадобиться вектор, а иногда список, но 2 класса с одинаковыми функциями я делать для этого не хочу.
0
nmcf
5783 / 5094 / 1743
Регистрация: 14.04.2014
Сообщений: 20,855
24.09.2015, 22:07 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
template <typename Type, typename Policy> class Cointainer {
    ...
private:
    Type data;
};
 
Cointainer<std::vector<int>, int> c;
Cointainer<std::forward_list<int>, int> c1;
1
NikitoZZZ
4 / 4 / 1
Регистрация: 28.09.2013
Сообщений: 152
24.09.2015, 22:14  [ТС] #5
Спасибо огромное ! Вы меня выручили !
0
DiffEreD
1435 / 772 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.09.2015, 22:18 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename Type, bool Policy = false>
struct Container
{
    using Cont_t = typename std::conditional<Policy,
                            std::vector<Type>,
                            std::forward_list<Type>>::type;
    Cont_t data;
};
 
int main()
{
    Container<int> c;
    c.data.push_front(42); // ok
    //c.data.push_back(42); // error
 
    Container<int, true> c2;
    //c2.data.push_front(42); // error
    c2.data.push_back(42); // ok
}
0
hoggy
6804 / 2991 / 515
Регистрация: 15.11.2014
Сообщений: 6,766
Завершенные тесты: 1
24.09.2015, 22:39 #7
Цитата Сообщение от NikitoZZZ Посмотреть сообщение
Мне нужно, чтобы эти данные были типа vector или типа forward_list в зависимости от ситуации. Как это реализовать ?
реализация зависит от ситуации.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.09.2015, 23:04 #8
Дабы не дублировать типы в шаблоне и при этом позволять задавать разные контейнеры, можно использовать template template параметры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <forward_list>
#include <iostream>
#include <memory>
#include <vector>
 
template <template <class,class> class C, class T, class A = std::allocator<T>>
struct S{
    C<T,A> data;
};
 
int main() {
    S<std::vector,int> vi;
    vi.data.push_back(42);
}
0
24.09.2015, 23:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2015, 23:04
Привет! Вот еще темы с ответами:

Как объявить переменную в классе? - C++
Доброго времени суток. Как правильно объявить переменную в private: Делаю так: private: std::vector&lt;double&gt;* parameters = new...

Как можно объявить класс, заранее не зная его тип template. - C++
Класс: template &lt;class type&gt; class My { private: int n; double sum; type *al; public: My() { al =...

Как в классе записать возвращаемую строковую переменную? - C++
как в классе записать возвращаемую строковую переменную? программа работает но ругается warning class_string.h #include...

как преобразовать переменную в другой тип в С++ - C++
как преобразовать переменную в другой тип в С++ вот например дан тип string как его можно преобразовать в тип char?


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

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

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