powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не тривиальное использование шаблонов
25 сообщений из 37, страница 1 из 2
Не тривиальное использование шаблонов
    #33541079
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся со следующей проблемой:

предположим что у нас есть простой шаблонный класс
template <class Type>
class Test
{
protected:
Type m_val;
}

Нам необходимо создать контейнер vector, содержащий экземпляры класса Test, причем тип Type может быть разным. Как это сделать?

vector<Test<int> > m_arr; - тогда можно запихнуть Test имеющий Type = int, а мне нужно чтобы еще и другие - например float, char*

Так вот - как запихнуть в vector все возможные Test, а не с определенным шаблонным параметром, например, ???
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541202
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541219
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное остается сделать базовый класс
и от него отнаследовать все остальные Test-ы

а вектор использовать как
vector<BaseTest *>

и на выходе приводить каждый экземпляр BaseTest к нужному типу.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541292
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb
Наверное остается сделать базовый класс
и от него отнаследовать все остальные Test-ы

а вектор использовать как
vector<BaseTest *>

и на выходе приводить каждый экземпляр BaseTest к нужному типу.



Posted via ActualForum NNTP Server 1.3


В производных классах будут функции типа:
int GetValue();
float GetValue();

В базовом классе их не определишь, так как возвращаются разные значения.
А как их вызовешь получив базовый класс - ведь механизм виртуальных функции в данном случае не подойдет.
Поэтому экземпляр базового класса сначала надо преобразовать к классу наследнику а затем вызвать эти функции

Поэтому встает вопрос:
как определить какой это класс наследник и преобразовать базовый к нему????
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541326
Фотография rodb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"ДимаДВ"

>Поэтому встает вопрос:
>как определить какой это класс наследник и преобразовать базовый к нему????

class TBase {
private:
String m_ClassName;
public:
__fastcall TBase(){m_ClassName = "TBase";};//соответственно в каждом
производном классе.
__property String ClassName {read = m_ClassName};
};

TBase *a_MyObj = берем указатель из вектора.

if(a_MyObj->ClassName == "integer")
{
приводим к TMyInteger
}
else if(a_MyObj->ClassName == "float")
{
приводим к TMyFloat
}
......


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541369
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rodb

"ДимаДВ"

>Поэтому встает вопрос:
>как определить какой это класс наследник и преобразовать базовый к нему????

class TBase {
private:
String m_ClassName;
public:
__fastcall TBase(){m_ClassName = "TBase";};//соответственно в каждом
производном классе.
__property String ClassName {read = m_ClassName};
};

TBase *a_MyObj = берем указатель из вектора.

if(a_MyObj->ClassName == "integer")
{
приводим к TMyInteger
}
else if(a_MyObj->ClassName == "float")
{
приводим к TMyFloat
}
......


Posted via ActualForum NNTP Server 1.3


Да - так можно но как-то с if'ами не хорошо!!

А есть ли возможность имея строку с именем типа преобразовать базовый класс в класс наследник?
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541380
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимаДВ
В производных классах будут функции типа:
int GetValue();
float GetValue();

В базовом классе их не определишь, так как возвращаются разные значения.
А как их вызовешь получив базовый класс - ведь механизм виртуальных функции в данном случае не подойдет.
Поэтому экземпляр базового класса сначала надо преобразовать к классу наследнику а затем вызвать эти функции
....

Почему именно так ?
Мона например в виртуальном методе возвращать(оперировать) классом, прикрывающий ВСЕ интересующие Вас типы. А у него уже перекрыть ВСЕ операторы равенства, интересующих Вас типов. Т.е. пущай он один знает и умеет превращать из нечто в нечто...

тогда будет нечто(в конечном итоге)

Код: plaintext
1.
2.
3.
int n = base.GetValue();
float f = base.GetValue();
xru x = base.GetValue();


с уважением
(круглый)
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541421
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 ДимаДВ
В производных классах будут функции типа:
int GetValue();
float GetValue();

В базовом классе их не определишь, так как возвращаются разные значения.
А как их вызовешь получив базовый класс - ведь механизм виртуальных функции в данном случае не подойдет.
Поэтому экземпляр базового класса сначала надо преобразовать к классу наследнику а затем вызвать эти функции
....

Почему именно так ?
Мона например в виртуальном методе возвращать(оперировать) классом, прикрывающий ВСЕ интересующие Вас типы. А у него уже перекрыть ВСЕ операторы равенства, интересующих Вас типов. Т.е. пущай он один знает и умеет превращать из нечто в нечто...

тогда будет нечто(в конечном итоге)

Код: plaintext
1.
2.
3.
int n = base.GetValue();
float f = base.GetValue();
xru x = base.GetValue();


с уважением
(круглый)

а есть какая то структура типа LP<чего то там> где можно хранить всякие типы
не знаешь как называется
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541456
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 ДимаДВ
В производных классах будут функции типа:
int GetValue();
float GetValue();

В базовом классе их не определишь, так как возвращаются разные значения.
А как их вызовешь получив базовый класс - ведь механизм виртуальных функции в данном случае не подойдет.
Поэтому экземпляр базового класса сначала надо преобразовать к классу наследнику а затем вызвать эти функции
....

Почему именно так ?
Мона например в виртуальном методе возвращать(оперировать) классом, прикрывающий ВСЕ интересующие Вас типы. А у него уже перекрыть ВСЕ операторы равенства, интересующих Вас типов. Т.е. пущай он один знает и умеет превращать из нечто в нечто...

тогда будет нечто(в конечном итоге)

Код: plaintext
1.
2.
3.
int n = base.GetValue();
float f = base.GetValue();
xru x = base.GetValue();


с уважением
(круглый)

ты имеешь в виду в базовом классе написать кучу виртуальных функции возвращающих разные типы:
virtual int GetVal();
virtual float GetVal();
virtual char* GetVal();

Но ведь он не даст этого сделать - error - функции отличаются только типом возвращаемого значения????

кроме того в одном классе нельзя писать функции
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541537
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимаДВ
ты имеешь в виду в базовом классе написать кучу виртуальных функции возвращающих разные типы:
virtual int GetVal();
virtual float GetVal();
virtual char* GetVal();
Но ведь он не даст этого сделать - error - функции отличаются только типом возвращаемого значения????
кроме того в одном классе нельзя писать функции


а теперь правильный вопрос...
читать что выше начеркал бум ?

далее идёт грубый пример...дальше - включайте Вашу хфантазёрку...
Код: plaintext
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.
class value
{
бла-бла-бла
	operator CString();
	operator double();
	operator int();
	operator long();
	operator ULONG();
	operator CTime();
	operator COleDateTime();

   value(void);
   value(base& rb);
};

class base
{
бла-бла-бла

value GetVal(void) { return value(this); };

};

class xru : base
{
};


где то в программе...

base* pb = .....;

int k = pb->GetVal();

код ессесвенно для передачи смысла..а не один в один....
гэт валью возвращает Вам некий класс. Этот класс имеет перегруженные операторы "=". Дальше надеюсь смысл понятен...

(круглый)
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33541587
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шаблон инстанцируется при компиляции, в этом его удобство.
Писать свой класс, возвращающий разные типы - нет смысла, поскольку есть, скажем OLEValue или как там его? И не понятно - зачем такой универсальный класс? Но в рамках заданного вопроса он пишется несложно.

class Dumb: public string{
...

string s;

public:

operator float(){return atof(s.c_str());}
operator int(){return atoi(s.c_str());}
operator char*(){return s.c_str()}
};
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33542546
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень понятно (просто не сталкивался) что делает, например:
operator int();
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33542692
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимаДВ

Это, Дими, оператор приведения ...
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33542959
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимаДВНе очень понятно (просто не сталкивался) что делает, например:
operator int();


Это такой хитрый оператор который позволяет обрашаться к переменной
типа yourintclass как к int .

Работает приблизительно так:
Код: plaintext
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.
class yourintclass
{
int s_value;
char s_text[ 10 ];
public:
     yourintclass():s_value( 0 )
{};
     yourintclass(int f_val): s_value(f_val)
{};
operator int()
    {
    retrun s_value;
    };

operator char*()
   {
    memset(&s_text[ 0 ],  0 ,  10 );
   sprintf(&s_text[ 0 ], %d, s_value);
   return &s_text[ 0 ];
   };
};

int main(void)
{
yourintclass y_int( 50 );
int someint= 10 ;
char* somestr=NULL;

someint=yourintclass; // работает operator int()
somestr=yourintclass; // работает operator char*()
// что будет вызываться  определяется типом левого операнда.

printf(" Integer Value of your int class  is %d", someint); 
printf(" String Value of your int class  is %s", somestr);


return  0 ; 
};

но в вашем случае,
нужна еще обработка соответствия типов(преобразование)
и обработка ошибок при не соответствии типов( преобразовании).

Правильно построенная обработка этих ошибок 80% безглючной реализации
функционала более высокого уровня.
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33543516
RealMaksimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы с Димой вместе работаем.
Проблема немного глубже и ширше, чем просто запихать в вектор класс, а затем приводить его к базовым типам.
Суть в чем: в некоем рабочем классе хранятся указатели на параметры
BaseParamClass* ptr1;
BaseParamClass* ptr2;
и указатель на функцию (или на худой конец просто флаг для switch, чтобы выбирать эту функцию).
Этот рабочий класс должен уметь делать
*ptr1 *= *ptr2;
*ptr1 += *ptr2 * (float)m_constvalue;
BOOL flag = (*ptr1 == *ptr2);
BOOL res = in(ptr1, string_vector);
и так далее. Операторы перегружать не обязательно, это просто примеры функций.
Если учесть что под BaseParamClass могут лежать IntParam, FloatParam, StringParam, IntVectorParam, FloatVectorParam, StringVectorParam, а также реют призраки DateTimeParam и DecimalParam... Проблема количества перегружаемых функций и безглючного преобразования типов приобретает остроту.
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33543564
ДимаДВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- ДимаДВНе очень понятно (просто не сталкивался) что делает, например:
operator int();


Это такой хитрый оператор который позволяет обрашаться к переменной
типа yourintclass как к int .

Работает приблизительно так:
Код: plaintext
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.
class yourintclass
{
int s_value;
char s_text[ 10 ];
public:
     yourintclass():s_value( 0 )
{};
     yourintclass(int f_val): s_value(f_val)
{};
operator int()
    {
    retrun s_value;
    };

operator char*()
   {
    memset(&s_text[ 0 ],  0 ,  10 );
   sprintf(&s_text[ 0 ], %d, s_value);
   return &s_text[ 0 ];
   };
};

int main(void)
{
yourintclass y_int( 50 );
int someint= 10 ;
char* somestr=NULL;

someint=yourintclass; // работает operator int()
somestr=yourintclass; // работает operator char*()
// что будет вызываться  определяется типом левого операнда.

printf(" Integer Value of your int class  is %d", someint); 
printf(" String Value of your int class  is %s", somestr);


return  0 ; 
};

но в вашем случае,
нужна еще обработка соответствия типов(преобразование)
и обработка ошибок при не соответствии типов( преобразовании).

Правильно построенная обработка этих ошибок 80% безглючной реализации
функционала более высокого уровня.


проблема еще в том что нужно сравнить два экземпляра типы которых неизвестны - не присваивая их
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33543762
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RealMaksimus...в некоем рабочем классе хранятся указатели на параметры
BaseParamClass* ptr1;
BaseParamClass* ptr2;
и указатель на функцию (или на худой конец просто флаг для switch, чтобы выбирать эту функцию).
Этот рабочий класс должен уметь делать
*ptr1 *= *ptr2;
*ptr1 += *ptr2 * (float)m_constvalue;
BOOL flag = (*ptr1 == *ptr2);
BOOL res = in(ptr1, string_vector);
и так далее. Операторы перегружать не обязательно, это просто примеры функций.
Если учесть что под BaseParamClass могут лежать IntParam, FloatParam, StringParam, IntVectorParam, FloatVectorParam, StringVectorParam, а также реют призраки DateTimeParam и DecimalParam... Проблема количества перегружаемых функций и безглючного преобразования типов приобретает остроту.


1) Что мешает BaseParamClass делегировать выше перечисленный функционал ? Он и по смыслу должен находиться именно там. Ведь его же Вы приравниваете, присваиваете, плюсуете и т.д.. Зачем типизацию высовывать наружу ? Чтоб гиморней ? Или ананизмом позаниматься ?
2) по поводу switch - рекомендую (хотя бы ознакомиться) с книгой Джэфа Элджера "С++ . Библиотека программиста."...
найдёте тута
(по секрету - есть более жлегантный способ передачи управления!!)
3) Вам никто не мешает делать т.н. "грань кристалла" (по книге). Т.е. некий класс знающий о неких свойствах (типе). И уже при дальнейшей работе использовать его...
4) Кол-во перегруженных операторов равно 8 (все Ваши типы) у ОДНОГО класса (как - описано выше)... Это много ?
5) Глючность из всего выше перечисленного сделать мона, но нуна СИЛЬНО постараться...


удачи Вам
(круглый)
ЗЫ
А может ну его нафик этот си плас плас ? Может пригласите со стороны номаного спеца, чтоб просто сделал на пару страницах кода то, что Вам нужно ?
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33543810
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДимаДВ
проблема еще в том что нужно сравнить два экземпляра типы которых неизвестны - не присваивая их

У вас проблема с постановкой задачи.


Все типы должны быть извесны.

И должны приводиться к типа совместимым для сравнения типам
иначе вас ждут большие неприянности на этапе тестирования
и поддержки.
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33543821
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-И должны приводиться к типа совместимым для сравнения типам
иначе вас ждут большие неприянности на этапе тестирования
и поддержки.

можно оперировать НЕ ИЗВЕСТНЫМИ типами базовых классов, при этом вызывая ПРАВИЛЬНЫЙ обработчик необходимого типа произвольного класса...

если задача стоит именно так - то она решаема...
и без всяких там глупых свитчей... и именно с помошью механизации "стандартного" си плас пласа...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33544138
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем вам variant'ы не нравятся ?
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33544291
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 onstat-И должны приводиться к типа совместимым для сравнения типам
иначе вас ждут большие неприянности на этапе тестирования
и поддержки.

можно оперировать НЕ ИЗВЕСТНЫМИ типами базовых классов, при этом вызывая ПРАВИЛЬНЫЙ обработчик необходимого типа произвольного класса...

если задача стоит именно так - то она решаема...
и без всяких там глупых свитчей... и именно с помошью механизации "стандартного" си плас пласа...


с уважением
(круглый)

Я имел ввиду что реализовывать все виртуалные методы
придется автору топика. Значит он должен знать
о всех типах с которыми оперирует.

Но я не вижу смысла городить допольнительное наследсование.
проще все хранить в union и вызывать соответствующие операторы преобразования.

Код: plaintext
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.
46.
47.
48.
49.
50.
51.
52.
union t_buff
{
int ibuff;
float fbuff;
double dbuff;
................
char   sbuff[sizeof(double)] //performance tunning для коротких 
//строк размер которых меньше 
//размерности double, что бы не дергать лишний раз  за new, delete.

char* vbuff; // указатель на длинную строку в куче.
};

#define  TYPE_INT 0x01
#define  TYPE_FLOAT 0x02
........
class type_container
{
unsigned char s_type;
f_buff s_container;
public:
type_container(int f_int)s_type(TYPE_INT), 
{
s_container.ibuff=f_int;
};
type_container(float f_float)
.......
operator int()
{
if   ((s_type&TYPE_INT)==TYPE_INT)
    {return t_buff.ibuff;}
}else //преобразование
{
int value= 0 ;
.........//преобразование
return value; 
};
throw unsigned char(s_type), // наверху ловим исключение о невозможности 
//преобразования s_type в int. s_type можно и нужно завернуть 
//в отдельный  класс
//чтобы не иметь конфликтов  при обработке исключений.
//или
//устанавливаем глобальную переменную с ошибкой преобразования,
//которую проверяем на верху (like   atoi ).

};

// и так далее  для других типов.
...........

};

...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33544327
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Но я не вижу смысла городить допольнительное наследсование.
проще все хранить в union и вызывать соответствующие операторы преобразования.....

мона...но зачем писать лишний код ? чтоб был ? или потренироваться ? тоды - да, сорьки я не прав.

если задача стоит как уменьшить кол-во кода, то совсем НЕ правильно, НЕ использовать механизм виртуальных методов, который делает за Вас вот это:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
if   ((s_type&TYPE_INT)==TYPE_INT)
    {return t_buff.ibuff;}
}else //преобразование
{
int value= 0 ;
.........//преобразование
return value; 
};

согласитесь код содержащий чиссо

Код: plaintext
1.
.........//преобразование

будет выглядеть более элегантно и будет содержать меньше кода. а это -> меньше потенциальных ошибок...

хотя опять же повторюсь - каждый по своему выбирает уровень сложности реализаци...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33544376
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-...все виртуалные методы придется....

кстати там виртуальный метод - ОДЫН...
если Вы хотите вообще ничего не реализовывать - кхм... тут уж я пас...наверное...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33544449
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 onstat-...все виртуалные методы придется....

кстати там виртуальный метод - ОДЫН...
если Вы хотите вообще ничего не реализовывать - кхм... тут уж я пас...наверное...


с уважением
(круглый)

Не вижу возможности реалзовать через один виртуалній метод
потому как типы возвращаемых результатов разные.

Как ?
...
Рейтинг: 0 / 0
Не тривиальное использование шаблонов
    #33544653
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
Не вижу возможности реалзовать через один виртуалній метод
потому как типы возвращаемых результатов разные.

Как ?

(сразу оговорюсь - описываеться механизация, а не точность реализации, посему если будете копировать в студию слова типа бла-бла-бла нуна убрать и заменить на конструктора-деструктора и т.д..)
пущай существует класс вэлью...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class base;
class value
{
бла-бла-бла
	operator CString();
	operator double();
	operator int();
	operator long();
	operator ULONG();
	operator CTime();
	operator COleDateTime();

   value(void);
};
виртуальных методов у него нуль...пущай он всё знает о различных типах и сам несёт в себе данные (для упрощения)...

пущай будет базовый класс для класса с шаблоном
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class base
{
бла-бла-бла

  value GetVal(void) { return GetValue(); };

protected:
  virtual value GetValue(void) { return m_valueTmp; }; // тут конечно же 
  // придёться возвратить например пустышку

  value m_valueTmp; // пустышка

};
класс base описан более чётче...возможно я не прав, что это не прописал ранее...смысл следующий... обращаемся к гэт вэл... возвращаем результат отработки перекрытого метода гэт вэлью...заметьте - виртуальный метод ОДЫН.


сласс шаблона...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template <class Type>
class xru : public base
{
бла-бла-бла
protected:
  value GetValue(void) { return Type::m_valueTmp; }; // а это класс вэлью. 
  // проинициализирован так, как нам нуна. Хотя никто не мешает
  // считать что это не класс а структура...

// хотя мона достучаться и так например (если проблемы с доступом)...
  value GetValue(void) { return Type::GetData(); }; // а это метод который 
  // должен существовать у созданного по шаблону класса. И пущай 
  // инстанцированный класс заботиться о наполнении ентого грёбанного 
  // value !

};


УРА ! НАШ КЛАСС !
Код: plaintext
1.
2.
3.
4.
5.
6.
class z
{
бла-бла-бла

  value GetData(void);
};

тогда имеем...

xru<z> Z;

бла-бла-бла
потеряли типизацию...или на событии пришёл безымянный указатель на данные из ГУИ например... Но мы точно знаем - сие есть указатель на базовый класс !!! никак не меньше ! ну и имеем всех, или только указатель - это кому как...

base* pb = ....;

value v = pb->GetVal();
int k = v.int();

т.к. value всё знает о всех типах, то мона и по просче....

int k = pb->GetVal();

а мона и так...
float f = pb->GetVal();

а мона и так...
z xz = pb->GetVal();


данный пример имеет немного отличия от приведённого выше в постах. разница в том, что в примере выше речь шла о типах которые способен обрабатывать base.. данная механизация (в посте выше) не плохо ложиться например на связку двух классов (и кстати без виртуал методов) типа RecordSet & Field. Т.е. первый заведует доступом к записи, а второй к полям. Чтоб не писать каждый раз программисту необходимый тип - приведённая выше автоматизация даёт выигрыш и лаконичность...

пример из данного поста, на мой взгляд убивает ту задачу в которой требуеться доступ к типизированному экземпляру шаблона.

пример скорректирован (за что снимаю шляпу), но аргументов приведённых выше - не дискредитирует...
пример есть пример, а не догма. На мой взгляд мона и более красивые способы родить...

с уважением
(круглый)
ЗЫ
Про двойную передачу за место свитчей - не буду, лучше уж почитайте книжку :)
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не тривиальное использование шаблонов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]