Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Bers
Заблокирован
#1

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

07.10.2011, 17:18. Просмотров 704. Ответов 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();
                }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2011, 17:18
Ответы с готовыми решениями:

Помогите разобраться с шаблонами
Пытаюсь реализовать новую для себя методику &quot;службы класса&quot;. Все хорошо...

Решить прикладную задачу с помощью циклического вычислительного процесса
Помогите решить...Не знаю как... Решить прикладную задачу с помощью...

помогите решить задачу
5 элементов массива, содержащего данные размера 2 байта, хранящегося по адресу...

Помогите пожалуйста решить задачу с динамической памятью и указателями
Тема: Структуры, указатели. Цель работы: научиться работать с указателями,...

Как решить проблему с шаблонами или это глюк компилятора C++ Builder 5?
Есть прога: template &lt; class TYPE &gt; class XXX { friend ostream...

1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 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 вызывать из интерфейса.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2011, 18:09

как решить эту задачу в Builder
Кривая (Аx) 2+(By) 2=C2 пересекается прямой y=Dx в точках M и N. Точку K(C/A...

помогите решить
нужно вычислить 100! + 2^100 (2 в степени 100) и в результате сохранить все...

Помогите решить задачку на С++
Написать программу учета заявок обмена квартир.Сведение о каждой...


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

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

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