![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А в каком виде ты себе представляешь такие «подсовывания»? Если я правильно понял, ты хочешь связывания (binding) на этапе компиляции. Но для связывания требуется объект, содержимое которого на этапе компиляции не известно. Т.е. получается, что компилятору придётся на ходу генерировать некую вспомогательную функцию, объект посылать как полуявный (заданный внутри <>, а не () ) параметр шаблонной функции и потом связывать его со сгенерированной вспомогательной функцией. Полагаю, для разработчиков компиляторов реализация такого – геморрой ещё тот... А в случае передачи cdecl вместо thiscall я вообще не представляю, что должно происходить (что будет делать cdecl-функция – игнорировать this-параметр? или параметров у неё должно быть на один больше, и один из них будет выступать в роли this?)
Что-то идей пока нету, с чего б беседу начать. Вот коли появится какая мысл́я – подниму... Это сообщение отредактировал(а) UnrealMan - 14.11.2006, 11:58 |
||||
|
|||||
| archimed7592 |
|
||||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
я представляю себе это так: семантически, ф-ция - это набор аргументов + возвращаемое значение. т. е. семантически разницы между f() и obj.f() и pobj->f() нету. чтобы работало следующее:
ну вот генерит компилятор конкретную специализацию. он все знает про эту ф-цию. зачем ему нужны какие-то вспомогательные вещи? точнее говоря может и нужны, но только для своего внутреннего представления структуры кода, но в итоговом бинаренике - как будто препроцессор поработал и наделал много copy-paste
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||||||
|
|||||||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
зы. а кто-нить располагает информацией, когда выйдет новый станадарт? 2007? 2008? 2009? как быстро появятся компиляторы для этого стандарта? в прошлый раз (в 2003 году) как быстро появились?
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| UnrealMan |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
obj (или *pobj) – это один из аргументов функции, и от этого никуда не денешься.
Ну ты сравнил :-) Директивы препроцессора и шаблоны – это почти совсем разные вещи. Общее у них только то, что с помощью них можно создавать абстракции (а при их объединении можно получить более мощные абстракции).
Дело в том, что количество параметров, передаваемых в функцию в данных вариантах temp_func<f> (...); temp_func<obj.f> (...); разное.
Ну, смотри:
Что будет при вызове функции pf в шаблонной функции Func? Очевидно, для корректного отрабатывания такого вызова нужен объект a. Откуда он возьмётся? Как ни крути, его придётся передавать в качестве отдельного параметра Func (подобно тому, как в вызове a.f() он в качестве отдельного параметра (this) передаётся в функцию f). Реализация шаблона сама должна везде подставлять неявный аргумент a при всяком вызове pf. Сигнатура у pf теперь не соотвествует её действительному статусу: да, используется она как void (pf)(), но в сущности это будет прежняя void (A:
Ну, про вспомогательную функцию эт я загнул, конечно... В препроцессоре идёт банальная обработка на уровне текста программы, чего не скажешь о шаблонах, поэтому сравнивать их в таком контексте как-то неразумно. |
||||||||||||
|
|||||||||||||
| archimed7592 |
|
||||||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
значит ещё раз как я себе это представляю: вот есть у наc зашаблоненный qsort. берем и пишем
что я хочу, чтобы из этого получилось: 3 ф-ции
зы. кстати, насчет передачи this...вот взять какой-нить шаблончик из нэймспейса std и передать ему в качестве аргумента ф-цию из другого нэймспэйса? компилятор же допетривает, что так и так и что это имя из другого нэймспэйса. т. е. как-то он эту ситуацию разруливает. не лучший пример, конечно, но, тем не менее, если задуматься, то семантически разницы между этими вещами большой нету. ну объект, ну нэймспэйс...у нэймспэйса адреса, правда, нету, но это так, мелочи... я отлично понимаю, что звучит все это как-то неубедительно...может даже глупо, но если именно с "глупой" точки зрения на это посмотреть, забыв про тот низкий уровень, где есть разница между stdcall и thiscall, между byval и byref, то идея вполне имеет право на жизнь... -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||||||||
|
|||||||||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Имеет. Только толку будет не много. В том варианте, что ты предлагаешь буду куча кодогенирации. Ещё проблема - это контроль времени жизни obj. Для С++ существует много различных релизаций обобщенных обратных вызовов и делигатов. Поэтому насущей необходимости в добавлении чего-то на подобие это в язык, мне кажется, нет. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |