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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Связать Matlab и visual studio 2010 http://www.cyberforum.ru/cpp/thread362579.html
Необходимо подключить библиотеки matlab к visual studio в c++. Проблема в том что я даже описания найти не могу в каких библиотеках матлаба какие функции находятся. Может кто-нибудь помочь?
C++ Help Me Gps Navigator Помогите с прогой GPS NAVIGATOR хотябы сделать 1 маршрут от а до б.... все советы учту есть сpp код ..... #include <iostream> #include <iomanip> #include <queue> #include <string> #include <math.h> #include <ctime> using namespace std; http://www.cyberforum.ru/cpp/thread361233.html
C++ Помогите разобраться с шаблонами
Пытаюсь реализовать новую для себя методику "службы класса". Все хорошо работало, пока не возникла необходимость в качестве клиента слжбы задействовать не обычный класс, а класс-шаблон. Впрочем, все по порядку... Не ругайте за обилие комментариев, я их сделал специально для того, что бы люди смогли понять мою задумку. Здесь линк на более удобный пастербин:...
C++ как раскрасить стаистический рисунок?
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> void Box(int x1, int y1, int x2, int y2); int main(void) { int xmax, ymax;
C++ диспечер задач http://www.cyberforum.ru/cpp/thread360687.html
пожалуйста скиньте диспечер задач на с++ или на с# у кого есть, а то вообще времени ни на что не хватает, чтоб еще его делать.
C++ Пользователь вводит координаты точки (x,y) определить входит ли данная точка в область или нет. Пользователь вводит координаты точки (x,y) определить входит ли данная точка в область или нет. подробнее

Показать сообщение отдельно
Bers
Заблокирован

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

07.10.2011, 17:18. Просмотров 633. Ответов 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();
                }
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru