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

C++

Войти
Регистрация
Восстановить пароль
 
Bers
Заблокирован
#1

Помогите решить конкретную задачу связанную с шаблонами - C++

07.10.2011, 17:18. Просмотров 637. Ответов 1
Метки нет (Все метки)

Такая задача: есть три класса, один простой, другой шаблонный, а третий - интерфейсный.
Простой класс и шаблонный - наследуются от интерфейса, и получают его в своё распоряжение.
Но простой класс юзает интерфейс одним способом, а шаблонный - другим. Как грамотно специализировать методы интерфейса для каждого класса?


1. TInterface<клиент> Интерфейс. Имеет кучу методов с дефолтными реализациями.
Не предназначен для самостоятельного существования.
Должен быть унаследован конкретными классами-клиентами.

2. Client Обычный класс клиент. Наследует интерфейс, и если нужно - переопределяет его поведение при помощи уточнения отдельных методов интерфейса

class Client : public TInterface<Client > {}; //принцип наследования интерфейса.

Теперь для TInterface<Client > можно специализировать хоть весь интерфейс,
хоть отдельные его методы

3. TClient<Parametr> клиент-шаблон. Тоже наследует интерфейс, и переопределяет его поведение.

//принцип наследования интерфейса.
template<class Parametr>
class TClient : public TInterface<TClient<Parametr> > {};


Но фишка в том, новое поведение интерфейса справедливо для любого <Parametr>
Как сделать так, что бы можно было один раз переопределить интерфейс для TClient<Parametr> ?
А не переопределять его каждый раз заного в ручную для каждого нового конкретного значения Parametr ?

Поясняю на конкретном примере:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//////////интерфейс////////////////////
template <class classClient>
class TInterface
{
    public: Print(const string& text) const { cout << text; }
}
 
//////////обычный клиент//////////////
class Client: public TInterface<Client> {}
template<> TInterface<Client>::Print(const string& text) const { cout << "обычный класс-клиент: "<< text; }
 
//////////шаблонный клиент///////////
 template<class Parametr>
 class TClient : public TInterface<TClient<Parametr>  >  {}; 
 
 
template<> TInterface<TClient<int> >::Print(const string& text) const    { cout << "шаблонный класс-клиент<int>: "  << text; }
template<> TInterface<TClient<char> >::Print(const string& text) const { cout << "шаблонный класс-клиент<char>: "<< text; }
как сделать для:

template<> TInterface<TClient<Parametr> >::Print(const string& text) const { cout << "обычный класс-клиент: "<< text; } // ?????????


Мне пришло в голову только одно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//переопределяем весь класс интерфейса целиком для ситуации, когда клиент-шаблон
template<  class Parametr, template<class Parametr> class TClient >
class TIConsole< TClient <Parametr> >
{
     //копипастим весь интерфейс из базового TInterface<клиент>
     //Вот как сделать так, что бы не надо было хотя б копипастить?
     // Копипаста ж зло...
     //есть идея использовать препроцессор.... но это же варварство...
 
     public: Print(const string& text) const 
                { 
                      cout << "шаблонный класс-клиент<Parametr>: "  << text;   
                      Parametr obj; obj.Work();
                }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2011, 17:18     Помогите решить конкретную задачу связанную с шаблонами
Посмотрите здесь:

Помогите решить простую задачу по C++ Visual C++
помогите решить задачу C++ Builder
Visual C++ Помогите решить задачу на C++
Помогите решить интересную задачу C++
Функции в С помогите решить задачу C++
Помогите решить задачу плыз C++
C++ помогите решить матем задачу в C++
C++ помогите решить задачу по классам
Помогите решить простенькую задачу C++
C++ Помогите решить задачу на списки C++
помогите решить задачу C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.10.2011, 18:09     Помогите решить конкретную задачу связанную с шаблонами #2
Цитата Сообщение от Bers Посмотреть сообщение
Но простой класс юзает интерфейс одним способом, а шаблонный - другим.
Интерфейс на то и интерфейс, что одинаково всеми юзается...
Читаю дальше.

Добавлено через 7 минут
Цитата Сообщение от Bers Посмотреть сообщение
Как сделать так, что бы можно было один раз переопределить интерфейс для TClient<Parametr> ?
А не переопределять его каждый раз заного в ручную для каждого нового конкретного значения Parametr ?
C++
1
2
3
4
5
6
7
8
9
10
11
template< class T >
class TemplateBase : public TInterface<T>
{
    // определяешь стандартное поведение для шаблонных клиентов
};
 
// Шаблонных клиентов наследуешь от этого класса
template< class T>
TClient : public TemplateBase<T>
{
};
Добавлено через 4 минуты
А, не, ты не об этом...

Добавлено через 5 минут
А что мешает просто создать перегруженные функции (не методы) для каждого типа, которые вызываться через интерфейсные методы будут?
Т.е. вместо obj.Work() будет Work(obj), где Work вызывать из интерфейса.
Yandex
Объявления
07.10.2011, 18:09     Помогите решить конкретную задачу связанную с шаблонами
Ответ Создать тему
Опции темы

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