Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Undisputed
199 / 130 / 35
Регистрация: 10.06.2014
Сообщений: 1,574
Завершенные тесты: 3
#1

Своеобразные интерфейсы вместо динамического полиморфизма

29.12.2017, 13:11. Просмотров 872. Ответов 20
Метки нет (Все метки)

Динамический полиморфизм как правило использует vtable что несет с собой некоторые доп. расходы.
Решил реализовать что-то похожее на интерфейс, который будет выполнять почти тот же контроль типов
(проверку на наличие методов) но на этапе компиляции. Интересует мнение форумчан.
Может можно сделать как то проще. Вот что получилось

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
#include <iostream>
 
template<typename T>
struct CarInterface
{
    static constexpr bool IsCarImplements = true;
    using ChildMethod = void (T::*)();
 
    ChildMethod method1;
    ChildMethod method2;
 
    constexpr
    CarInterface()
    {
        method1 = &T::method1;
        method2 = &T::method2;
    }
};
 
struct Car : CarInterface<Car>
{
    void method1()
    {
        std::cout << "Method1" << '\n';
    }
 
    void method2()
    {
        std::cout << "Method2" << '\n';
    }
};
 
template<typename T>
typename std::enable_if<T::IsCarImplements, void>::type
test(T car)
{
    car.method1();
    car.method2();
}
 
int main()
{
    Car c;
    test(c);
}
Если будете запускать в студии 2015 - закомментируйте constexpr.

В общем решалось здесь вот что:
1. Возможность создать функции принимающие только те типы которые соответствуют интерфейсу (проверяется через enable_if)
2. Проверка наличия методов которые требуются для конкретного типа (В данном случае Car, проверяется в момент наследования на основе шаблонного аргумента для родительского класса. Если не получится взять адреса методов дочернего класса в конструкторе родительского класса, то произойдет ошибка компиляции)
3. Контроль реализации типов

Интересно мнение со стороны С++ программистов.

Добавлено через 2 минуты
Стоит ли игра свеч?
То есть использование данного подхода вместо динамического полиморфизма...
Если нет, то хотелось бы знать почему

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

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2017, 13:11
Ответы с готовыми решениями:

Пример использования генератора случайных чисел для демонстрации динамического полиморфизма
Пример использования генератора случайных чисел для демонстрации динамического...

Исправить программу. Статический массив вместо динамического
Как обойтись без 12 строки? #include &lt;stdio.h&gt; #include &lt;iostream&gt;...

Вместо ожидаемого динамического массив получаю всего один элемент
при остановки в visual, сразу после создания наблюдаю такую картину: вот...

иллюстрация полиморфизма
Доброго времени суток!написал примитив для иллюстрации...

Использование полиморфизма
Помогите написать программу, которая использует перегрузительную функцию для...

20
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7024 / 3320 / 452
Регистрация: 04.12.2011
Сообщений: 9,255
Записей в блоге: 5
31.12.2017, 00:15 #21
Цитата Сообщение от TRam_ Посмотреть сообщение
IGPIGP, вроде бы динамический полиморфизм как раз и есть именно подобным свичеванием.
Нет. Это переход по индексу. Причём важно именно то, что базовыё класс и код отвечающий за обобщённый доступ (указатель/ссылка на базовый класс) не нуждается в изменении при расширении участников интерфейса (наследников, как принято).
0
31.12.2017, 00:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2017, 00:15

Виды полиморфизма C++
Разбираю полиморфизм. Наткнулся на классификацию с тремя видами:1.специальный,...

Реализация полиморфизма
Читал что существует примерно 10 способов реализации полиморфного контейнера....

Принципы наследования и полиморфизма
Даны натуральное число n, действительные числа a1 a2,...,an. Если...


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

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

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