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

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

Войти
Регистрация
Восстановить пароль
 
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

шаблон для некоторых классов - C++

29.12.2012, 16:23. Просмотров 1060. Ответов 13
Метки нет (Все метки)

идея, скорее всего, бредовая, но всё же уточнить нужно, вдруг так можно. У меня возникла такая ситуация: есть две идентичные функции. Единственное различие между ними это тип списка, передаваемого в них, и тип объекта, который объявляется в этих функциях (по типу списка). Так вот, можно ли объединить эти две функции в такую функцию, которая принимает только один из этих типов и никакой другой (оба типа унаследованы от одного базового класса и в функции нужно вызывать виртуальную функцию).

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
class Base {
public:
    virtual void f() {};
};
 
class Der :  public Base {
public:
    void f() {}
};
 
class Der2 : public Base {
public:
    void f() {}
};
 
 
void funk(std::list<Der>& l) {
    Der a;
    a.f();
    l.push_back(a);
}
 
void funk(std::list<Der2>& l) {
    Der2 a;
    a.f();
    l.push_back(a);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 16:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос шаблон для некоторых классов (C++):

Почему в некоторых случаях используется массив для хранения стека, а в некоторых нет? - C++
Почему в некоторых случаях используется массив для хранения стека ,а в некоторых нет

Шаблон классов - C++
Здорова! Не получается никак составить шаблон для классов: struct element; struct Link { element *prev, *next;//informaci9...

Иерархия классов + шаблон - C++
Помогите проверить, правильно ли я реализовал иерархию классов. базовый класс:Дата(год,месяц, день) ...

LNK2019 шаблон классов - C++
Доброго времени суток. Пишу шаблон классов: akima.h // файл объявления #ifndef AKIMA_H #define AKIMA_H ...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон - C++
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

Как переделать эту прогу в шаблон классов "Двусвязный список" произвольных элементов - C++
#include &lt;iostream.h&gt; #include &lt;stdlib.h&gt;2 #include &lt;conio.h&gt; using namespace std; struct Element { public: double...

13
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.12.2012, 16:25 #2
Riderik,
C++
1
std::list<Base*>
?
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
29.12.2012, 16:27  [ТС] #3
ForEveR, выбьет ошибку, что нельзя преобразовать один тип листа к другому
0
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
29.12.2012, 16:27 #4
C++
1
2
3
4
5
6
7
template<T>
void funk(std::list<T>& l) 
{
    T a;
    a.f();
    l.push_back(a);
}
В чем проблема ?
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
29.12.2012, 16:29  [ТС] #5
Avazart, ну это да, но сюда же можно передать любой тип, у которого найдется функция f. А вот можно ли передать только что-то из определенной иерархии?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
29.12.2012, 16:31 #6
А то, что вариант, предложенный ForEver'ом, не рабочий, это было установлено опытным путем или предпололжение? Потому что это как раз то, что тебе нужно.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.12.2012, 16:34 #7
Riderik, Ну как бэ.

C++
1
2
3
4
5
6
7
8
9
typedef std::list<std::shared_ptr<Base>> bases_t;
 
template<typename T>
void f(bases_t& l)
{
   std::shared_ptr<Base> p(new T());
   p->foo();
   l.push_back(p);
}
Подавать в функцию естественно список с указателями на Base. Или std::enable_if использовать.
1
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
29.12.2012, 16:36  [ТС] #8
Kastaneda, написал так:
C++
1
2
3
4
5
6
7
8
void funk(std::list<Base*>& l) {
}
 
int main() {
    std::list<Der*> l;
    funk(l);
    return 0;
}
Выбило ошибку
невозможно преобразовать параметр 1 из "std::list<_Ty>" в "std::list<_Ty> &"
не удается инициализировать ссылку типа "std::list<Base *, std::allocator<Base *>> &" (квалифицируется как неконстантная) со значением типа "std::list<Der *, std::allocator<Der *>>"

Добавлено через 1 минуту
ForEveR, а это хорошая мысль
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
29.12.2012, 16:42 #9
Думаю имлось ввиду сделать так
C++
1
2
std::list<Base*> l;
funk(l);
а список уже заполнять указателями на Der или Der2.
Но там потом возникла бы заморочка с создаванием объекта нужного типа, так что да, возможно и не самый удобный вариант.
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
29.12.2012, 16:47  [ТС] #10
А стоп. У меня есть два списка: list<Der> и list<Der2> (ну или списки на их указатели). Они необходимы, так как используются методы из Der и Der2. И там же один из списков нужно отправить в эту функцию. Так можно сделать?

Добавлено через 3 минуты
Типа этого:
C++
1
2
3
4
5
6
7
int main() {
    std::list<Der> l;
    std::list<Der2> l2;
    funk(l);
    funk(l2);
    return 0;
}
0
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
29.12.2012, 16:48 #11
На мой взгляд перегрузка единственный оптимальный вариант в данном случае
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.12.2012, 16:51 #12
Можно. Но придется слегка поколебаться.

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
#include <type_traits>
#include <list>
 
class Base
{
};
 
class Der : public Base
{
};
 
template<typename T>
void f(T&, typename std::enable_if<!std::is_base_of<Base, typename T::value_type>::value>::type** = 0);
 
template<typename T>
void f(T&, typename std::enable_if<std::is_base_of<Base, typename T::value_type>::value>::type** = 0)
{
}
 
int main()
{
    std::list<Der> ders;
    f(ders);
}
ну или просто static_assert влепить, если std::is_base_of<>::value вернет false.
2
Avazart
Эксперт С++
7235 / 5431 / 303
Регистрация: 10.12.2010
Сообщений: 24,133
Записей в блоге: 17
29.12.2012, 16:59 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
3
4
5
6
7
template<typename T>
void f(T&, typename std::enable_if<!std::is_base_of<Base, typename T::value_type>::value>::type** = 0);
 
template<typename T>
void f(T&, typename std::enable_if<std::is_base_of<Base, typename T::value_type>::value>::type** = 0)
{
}
А зачем дублировать ?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.12.2012, 17:07 #14
Avazart, Дублировать? В одном случае работает, если не base_of, во втором, если base_of.

Добавлено через 1 минуту
Avazart, В сущности конечно можно оставить одну функцию. Тогда ошибка будет не undefined reference, а даже нечто более понятное.

Добавлено через 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
#include <type_traits>
#include <list>
 
class Base
{
};
 
class Der : public Base
{
};
 
template<typename T>
void f_impl(std::list<T>&, std::false_type);
 
template<typename T>
void f_impl(std::list<T>&, std::true_type)
{
}
 
template<typename T>
void f(std::list<T>& lst)
{
    f_impl(lst, std::is_base_of<Base, T>::type());
}
 
int main()
{
    std::list<Der> ders;
    f(ders);
}
1
29.12.2012, 17:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2012, 17:07
Привет! Вот еще темы с ответами:

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

Для каждого из некоторых количества целых чисел ... - C++
Для каждого из некоторых количества целых чисел ответить на вопрос. &quot;Правда ли что число делиться на каждую свою цифру?&quot; Добавлено...

Шаблон для очереди - C++
Возможно, у кого-нибудь есть готовый шаблон очереди? С функциями добавления, удаления, распечатки, поиска в очереди и т.д.?

Шаблон для стеков - C++
Нужно написать шаблонный класс для работы со стеком элементов типа T. Я делаю так, чтобы в классе была структура Element, которая содержит...


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

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

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