Здравствуйте, Аноним, Вы писали:
А>Как передать в функцию указатель на параметризированную структуру, а определить тип структуры уже внутри этой функции:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Как передать в функцию указатель на параметризированную структуру, а определить тип структуры уже внутри этой функции:
B>
А>>// определение функции
B>template<class Type>
А>>void Func(const PROTO<classType>& s)
А>>{
А>> // ...
А>>}
B>
Ключевое слово class в списке параметров конечно же лишнее. Правильно вот так:
Re[3]: Как передать в функцию указатель на шаблон?
От:
Аноним
Дата:
04.10.05 13:41
Оценка:
Здравствуйте, Bell, Вы писали:
B>>
А>>>// определение функции
B>>template<class Type>
А>>>void Func(const PROTO<classType>& s)
А>>>{
А>>> // ...
А>>>}
B>>
B>
B>// определение функции
B>template<class Type>
B>void Func(const PROTO<Type>& s)
B>{
B> // ...
B>}
B>
Спасибо, так работает. Т.е. для того чтобы, фукнция могла принимать параметризованные параметры, и конкретизировать их в run-time'е ее необходимо сделать также параметризированной.
Re[4]: Как передать в функцию указатель на шаблон?
Здравствуйте, Аноним, Вы писали:
А>Спасибо, так работает. Т.е. для того чтобы, фукнция могла принимать параметризованные параметры, и конкретизировать их в run-time'е ...
В run-time'е в данном случае ничего не конкретизируется. Все происходит в compile-time: при необходимости компилятор генерирует нужную функцию из шаблона и генерирует код вызова этой функции.
А>...ее необходимо сделать также параметризированной.
Как правило, это лучший вариант, но никто не запрещает явно перегрузить нужную функцию:
Re[5]: Как передать в функцию указатель на шаблон?
От:
Аноним
Дата:
04.10.05 14:17
Оценка:
Здравствуйте, Bell, Вы писали:
B>Как правило, это лучший вариант, но никто не запрещает явно перегрузить нужную функцию:
типов может быть до 20-ти, поэтому перегрузка не подходит.
B>В run-time'е в данном случае ничего не конкретизируется. Все происходит в compile-time: при необходимости компилятор генерирует нужную функцию из шаблона и генерирует код вызова этой функции.
Но, как все-таки в функции определить какой тип получен?
// объявление шаблона
template <class Type>
struct PROTO{
int p;
Type str;
};
typedef struct proto1 {
int p1;
}proto1;
typedef struct proto2 {
int p2;
}proto2;
PROTO<proto1> param1;
PROTO<proto2> param2;
...
Func(param1);
Func(param2);
// определение функции
template <class Type>
void Func(const PROTO<class Type>& s)
{
int a = s.p; // нет ошибки
int b = s.str.p1; // error C2039 p1 is not member of proto2
int c = s.str.p2; // error C2039 p2 is not member of proto1
}
Re[6]: Как передать в функцию указатель на шаблон?
Здравствуйте, Аноним, Вы писали:
А>Но, как все-таки в функции определить какой тип получен?
Шаблон функции используется тогда, когда ее реализация не зависит от параметра шаблона. Если же в зависимости от типа требуется различная реализация, то тут нужно использовать или перегрузку. Если из общей стаи возможных параметров выбиваются только несколько типов, то обычно пишется один шаблон функции и перегрузки для "особых" случаев.
Если же реализация Func сильно зависит от типа параметра, то не логичнее ли сделать ее членом?
Любите книгу — источник знаний (с) М.Горький
Re[6]: Как передать в функцию указатель на шаблон?
Здравствуйте, Аноним, Вы писали:
А>Но, как все-таки в функции определить какой тип получен?
Специализации помогут нам
Но зачем тебе шаблоны и вообще перегрузка такая хитрая, если у тебя всё разное и поля и типы и работа с ними по-разному стрится, но при этом перегружать функции нехорошо?
Может боьше про задачу расскажешь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Как передать в функцию указатель на шаблон?
3. -добавить void FuncImpl в Type (если есть возможность расширять Type)
Выбор за Вами
Re[7]: Как передать в функцию указатель на шаблон?
От:
Аноним
Дата:
04.10.05 15:40
Оценка:
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
А>>Но, как все-таки в функции определить какой тип получен?
E>Специализации помогут нам
E>Но зачем тебе шаблоны и вообще перегрузка такая хитрая, если у тебя всё разное и поля и типы и работа с ними по-разному стрится, но при этом перегружать функции нехорошо?
E>Может боьше про задачу расскажешь?
В структуре PROTO
template <class Type>
struct PROTO{
// ...
Type str;
};
передаются конфигурационные параметры для создания объектов разных типов. И эти параметры очень сильно отличаются от объекта к объекту, но есть и ряд общих параметров. Поэтому я и подумал о шаблоне, где
Type str;
описывает те параметры, которые отличаются.
А использовать объекты структур PROTO надо таким образом:
А>передаются конфигурационные параметры для создания объектов разных типов. И эти параметры очень сильно отличаются от объекта к объекту, но есть и ряд общих параметров. Поэтому я и подумал о шаблоне, где
Re[9]: Как передать в функцию указатель на шаблон?
От:
Аноним
Дата:
04.10.05 16:06
Оценка:
Здравствуйте, ssm, Вы писали:
ssm>Здравствуйте, Аноним, Вы писали:
А>>передаются конфигурационные параметры для создания объектов разных типов. И эти параметры очень сильно отличаются от объекта к объекту, но есть и ряд общих параметров. Поэтому я и подумал о шаблоне, где
ssm>ну дык:
ssm>
Здравствуйте, Аноним, есть тогда такое предложение:
1) Вместо текстовой строки, использовать какую-то боле удобную форму архива данных, например класс, который по имени аргумента и его типу умеет получать/возвращать значение
2) у всех типов protoXXX завести конструктор от такого объекта, тогда и упаковывать/распаковывать аргументы будет удобно, и шаблон нужный написать, и иерархию классов protoXXX можно будет завести, если они похожи, и отличаются только нескколькими параметрами.
Кроме того, всю эту кухню можно будет удобно логировать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском