Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. Понятно, что основная тема, которую надо задвигать — это run-time генерация типов в C# и идущие от этого ограничения. Только я сильно сомневаюсь, что эти люди воспримут эти объяснения. Хотелось бы какой-нибудь простой пример того, что можно сделать хорошо с помощью шаблонов и нельзя сделать сносно с помощью обощенных типов. Сам голову уже три дня ломаю, пока ничего не придумал.
DG>>Вот такое на generic-ах не делается:
M>Ага, только им еще теперь надо концепцию policy объяснить .
Можно рассказать, что такое множественное наследование (mixin-ы и т.д.) и его пользу для народа.
А затем показать, что с использованием шаблонов можно эмулировать множественное наследование для .Net-а.
С помощью generic-ов множественное наследование эмулировать не получается.
M>Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. Понятно, что основная тема, которую надо задвигать — это run-time генерация типов в C# и идущие от этого ограничения. Только я сильно сомневаюсь, что эти люди воспримут эти объяснения. Хотелось бы какой-нибудь простой пример того, что можно сделать хорошо с помощью шаблонов и нельзя сделать сносно с помощью обощенных типов. Сам голову уже три дня ломаю, пока ничего не придумал.
M>Спасибо заранее, M>Владимир.
M>Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. Понятно, что основная тема, которую надо задвигать — это run-time генерация типов в C# и идущие от этого ограничения. Только я сильно сомневаюсь, что эти люди воспримут эти объяснения. Хотелось бы какой-нибудь простой пример того, что можно сделать хорошо с помощью шаблонов и нельзя сделать сносно с помощью обощенных типов. Сам голову уже три дня ломаю, пока ничего не придумал.
Чаще всего, лучше то, что проще. Нельзя сказать, что лучше шаблоны или обобщенные типы — это все для любителей пофлеймить. Можно только объяснить разницу, а дальше надо отталкиваться от задачи.
Здравствуйте, mefrill, Вы писали:
M>Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. [...] Сам голову уже три дня ломаю, пока ничего не придумал.
M>Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. Понятно, что основная тема, которую надо задвигать — это run-time генерация типов в C# и идущие от этого ограничения. Только я сильно сомневаюсь, что эти люди воспримут эти объяснения. Хотелось бы какой-нибудь простой пример того, что можно сделать хорошо с помощью шаблонов и нельзя сделать сносно с помощью обощенных типов. Сам голову уже три дня ломаю, пока ничего не придумал.
M>Спасибо заранее, M>Владимир.
если ты пишешь
template<class T>
void f(T& t)
{
t(1);
};
то в эту функцию ты сможешь засунуть как другую функцию, так и объект какого-нть класса, у которого определен operator(), который можно вызвать с одним параметром типа int, при этом тебе начихать на остальные дефолтные параметры или их отсутствие, на возвращаемое значение:
struct A
{
int operator()(int) {}
};
struct B
{
void operator()(int, float = 0) {}
};
double func(int, double = 0) { return 0; }
int main()
{
A obj1;
B obj2;
f(obj1);
f(obj2);
f(func);
}
M>Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. Понятно, что основная тема, которую надо задвигать — это run-time генерация типов в C# и идущие от этого ограничения. Только я сильно сомневаюсь, что эти люди воспримут эти объяснения. Хотелось бы какой-нибудь простой пример того, что можно сделать хорошо с помощью шаблонов и нельзя сделать сносно с помощью обощенных типов. Сам голову уже три дня ломаю, пока ничего не придумал.
Это зависит от задачи.
Преумущество у шаблонов — не создается код во времени выполнения программы.
Преумущество у дженериков — работают во времени выполнения программы.
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, mefrill, Вы писали:
M>>Недавно у меня возникла проблема: необходимо объяснить людям, не разбирающимся в си++, почему шаблоны си++ лучше, чем обобщенные типы в C#. Понятно, что основная тема, которую надо задвигать — это run-time генерация типов в C# и идущие от этого ограничения. Только я сильно сомневаюсь, что эти люди воспримут эти объяснения. Хотелось бы какой-нибудь простой пример того, что можно сделать хорошо с помощью шаблонов и нельзя сделать сносно с помощью обощенных типов. Сам голову уже три дня ломаю, пока ничего не придумал.
__>Это зависит от задачи. __>Преумущество у шаблонов — не создается код во времени выполнения программы. __>Преумущество у дженериков — работают во времени выполнения программы.
__>Простой пример не реализуемый на дженериках:
J>то в эту функцию ты сможешь засунуть как другую функцию, так и объект какого-нть класса, у которого определен operator(), который можно вызвать с одним параметром типа int, при этом тебе начихать на остальные дефолтные параметры или их отсутствие, на возвращаемое значение:
А ничего что есть дженерик делегаты и дженерик интерфейсы? Ну, там:
T delegate SomeFuncTypw<T>(T x);
interface I
{
T SomeFuncTypw<T>(T x);
}
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Сравнение шаблонов C++ и обобщенных типов C#
Реализуются но немного по другому. Вводится фективный член типа некоторого дженерик-интрфейса, а интеряфейс реализуется в структуре. Могу статейку тиснуть про этот метод. Я так дженерик-коллекции сделал для R#-а.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Сравнение шаблонов C++ и обобщенных типов C#
J>>то в эту функцию ты сможешь засунуть как другую функцию, так и объект какого-нть класса, у которого определен operator(), который можно вызвать с одним параметром типа int, при этом тебе начихать на остальные дефолтные параметры или их отсутствие, на возвращаемое значение:
VD>А ничего что есть дженерик делегаты и дженерик интерфейсы? Ну, там: VD>
VD>T delegate SomeFuncTypw<T>(T x);
VD>interface I
VD>{
VD> T SomeFuncTypw<T>(T x);
VD>}
VD>