С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
1

Полиморфизм и шаблонные методы класса

25.09.2014, 19:44. Показов 1507. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть некий АБК:

C++
1
2
3
4
5
6
7
8
9
10
template <class Ch> class EventIO // interface for derived classes
    {
    public:
        typedef std::basic_string<Ch> string_type;
 
        template <class Value>
virtual bool write_value(const string_type& name_value, const Value& value) = 0;
        template <class Value> 
virtual Value read_value(const string_type& name_value) = 0; // throw
    };
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2014, 19:44
Ответы с готовыми решениями:

Шаблонные методы шаблонного класса в cpp-файле
Есть класс-шаблон Map. В нем обьявленны несколько шаблонных методов forEach. template&lt;typename...

Реализовать шаблонные методы
Код, который создает динамический массив и выводит на экран. #include &lt;iostream&gt; using...

Шаблонные чистые виртуальные методы
Возник вопрос: Есть у нас допустим класс, который мы желаем сделать абстрактным: template...

Можно ли в не шаблонном классе создать шаблонные методы?
Можно ли в не шаблонном классе создать шаблонные методы? Пример: Есть перегруженная функция...

14
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
25.09.2014, 19:48  [ТС] 2
Есть некий АБК:

C++
1
2
3
4
5
6
7
8
template <class Ch> class EventIO // interface for derived classes
    {
    public:
        typedef std::basic_string<Ch> string_type;
 
        template <class Value> virtual bool write_value(const string_type& name_value, const Value& value) = 0;
        template <class Value> virtual Value read_value(const string_type& name_value) = 0; // throw
    };
Функция write_value куда-то записывает переменную name_value со значением value.
Read_value ищет где-то переменную name_value и возвращает Value.

Есть один из производных классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class Ch> class XML_IOEvent : public EventIO<Ch>
    {
    public:
        XML_IOEvent(const string_type& filename) : _filename(filename), pt() {}
        // write 1 value to the file
        template <class Value> virtual bool write_value(const string_type& name_value, const Value& value);
        // extract 1 value from the file
        template <class Value> virtual Value read_value(const string_type& name_value); // throw
    private:
        string_type _filename;
        boost::property_tree::ptree pt;
    };
Эти функции работают по тому же принципу в XML-файле.

Невозможно создать шаблонную виртуальную функцию-член в классе EventIO. Вопрос: как лучше организовать полиморфизм? Без шаблона никак.
Заранее спасибо.
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.09.2014, 19:50 3
C++
1
2
3
4
5
6
7
template <typename T>
class A
{};
 
template <typename T>
class B : public A<T>
{};
0
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
25.09.2014, 19:58  [ТС] 4
MrGluck, так вроде бы так и есть.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
25.09.2014, 20:05 5
Не пытался разобраться в приведенном куске кода, но интуиция подсказывает, что надо посмотреть в сторону type erasure
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.09.2014, 20:10 6

Не по теме:

Когда я публиковал пост - этого ещё не было



Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
class A
{
public:
    virtual void foo() = 0;
};
 
template <typename T, typename U>
class B : public A<T>
{
public:
    // works with type U
    void foo() { std::cout << "Done"; }
};
Чисто виртуальные функции шаблонными делать нельзя.
0
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
25.09.2014, 21:06  [ТС] 7
MrGluck, я думал об этом, но получается, что один экземпляр класса может использовать только один тип (U). Есть ли еще какие-либо варианты?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.09.2014, 21:38 8
CHELOVEKPAUK, Не использовать шаблоны в базовом классе, а использовать какой-нибудь boost::any.
Уйти от динамического и остаться только в рамках статического.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.10.2014, 14:36 9
сделать T шаблонным параметром класса а не ф-ции

Добавлено через 1 минуту
CHELOVEKPAUK, а где T используется? внутри ф-ции?
0
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
01.10.2014, 14:51  [ТС] 10
aLarman, только внутри функции.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.10.2014, 14:53 11
CHELOVEKPAUK, тогда быть может auto прокатит? или нет возможности воспользоваться плюхой 11го стандарта?
0
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
01.10.2014, 15:00  [ТС] 12
aLarman, auto нельзя использовать в функциях
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.10.2014, 15:00 13
https://www.cyberforum.ru/cpp-... 62886.html
Возврат boost::any из функции
Продолжение следует...
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.10.2014, 15:03 14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class Ch> class IOSystem
{
public:
    typedef std::basic_string<Ch> string_type;
 
    virtual bool write(const string_type& _filename, const string_type& _address) = 0;
    virtual string_type read(const string_type& _filename, const string_type& _address) = 0; // throw
 
    virtual ~IO_System() {}
};
template<class T, class U>
class D: public IOSystem<U>
{
public:
 virtual bool write(const string_type& _filename, const string_type& _address)
{
T val;}
    virtual string_type read(const string_type& _filename, const string_type& _address)
{
T val;}
}
а так
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.10.2014, 15:18 15
Есть некий абстрактный базовый класс, который имеет две шаблонные функции. Мне нужно сделать эти функции виртуальными и создать несколько производных классов. Как лучше это устроить, учитывая то, что создать шаблонную виртуальную функцию нельзя?
C++
1
2
3
4
5
6
7
8
struct my_class
{
    template<typename T>inline void some_method();
    virtual void some_method_int(){}//заглушка
    virtual void some_method_bool(){}//заглушка
};
template<>inline void my_class::some_method<int>(){some_method_int();}
template<>inline void my_class::some_method<bool>(){some_method_bool();}
Работать будет только для заранее заданного набора типов. Зато, с шаблонами.
0
01.10.2014, 15:18
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2014, 15:18
Помогаю со студенческими работами здесь

Полиморфизм и private методы
Почему при полиморфном вызове функции возможен вызов private метода??? Хотя бы предупреждение какое...

шаблонные методы шаблона. Специализация.
Вопрос: каким образом можно вынести реализацию методов класса за его пределы? Изначально вопрос...

Полиморфизм и виртуальные методы
Здравствуйте, проблема с запуском,вроде бы все правильно делалось,а выводит ошибку и не хочет...

Полиморфизм. Виртуальные методы
Здраствуйте уважаемые админы!!У меня проблемы:swoon: с некоторыми предметами,у меня к вам очень...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru