Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Новый C++ - что вы от него хотите, пожелания и замечания для C++0x 
:(
    Опции темы
UnrealMan
Дата 14.11.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  13.11.2006,  21:26 Найти цитируемый пост)
но всё равно не получиться для stdcall подсунуть thiscall для конкретного объекта и наоборот, а хотелось бы - проблемы в реализации быть не должно...

А в каком виде ты себе представляешь такие «подсовывания»? Если я правильно понял, ты хочешь связывания (binding) на этапе компиляции. Но для связывания требуется объект, содержимое которого на этапе компиляции не известно. Т.е. получается, что компилятору придётся на ходу генерировать некую вспомогательную функцию, объект посылать как полуявный (заданный внутри <>, а не () ) параметр шаблонной функции и потом связывать его со сгенерированной вспомогательной функцией. Полагаю, для разработчиков компиляторов реализация такого – геморрой ещё тот... А в случае передачи cdecl вместо thiscall я вообще не представляю, что должно происходить (что будет делать cdecl-функция – игнорировать this-параметр? или параметров у неё должно быть на один больше, и один из них будет выступать в роли this?)

Цитата(archimed7592 @  13.11.2006,  21:26 Найти цитируемый пост)
поднимай тему на сорсах, будем обсуждать с яркими личностями 

Что-то идей пока нету, с чего б беседу начать. Вот коли появится какая мысл́я – подниму...


Это сообщение отредактировал(а) UnrealMan - 14.11.2006, 11:58
PM MAIL   Вверх
archimed7592
Дата 14.11.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  14.11.2006,  12:00 Найти цитируемый пост)
А в каком виде ты себе представляешь такие «подсовывания»?
я представляю себе это так: семантически, ф-ция - это набор аргументов + возвращаемое значение. т. е. семантически разницы между f() и obj.f() и pobj->f() нету. чтобы работало следующее:
Код
temp_func<f> (...);
temp_func<obj.f> (...);
temp_func<(pobj->f)> (...);
т. е. чтобы в шаблоне описывалась только семантика, а реализация подставляется во время компиляции. как в #define...все равно компилятор генерит по экземпляру на каждую специализацию. собственно и все чего я хочу.

Цитата(UnrealMan @  14.11.2006,  12:00 Найти цитируемый пост)
Если я правильно понял, ты хочешь связывания (binding) на этапе компиляции.
угу. во время компиляции. т. е. продвинутого препроцессинга smile

Цитата(UnrealMan @  14.11.2006,  12:00 Найти цитируемый пост)
Но для связывания требуется объект, содержимое которого на этапе компиляции не известно.
что значит неизвестно? когда ты пишешь f () - все известно. когда пишешь obj.f () - тоже. в шаблоне же, на этапе специализации тоже все известно.

Цитата(UnrealMan @  14.11.2006,  12:00 Найти цитируемый пост)
 Т.е. получается, что компилятору придётся на ходу генерировать некую вспомогательную функцию, объект посылать как полуявный (заданный внутри <>, а не () ) параметр шаблонной функции и потом связывать его со сгенерированной вспомогательной функцией
ну вот генерит компилятор конкретную специализацию. он все знает про эту ф-цию. зачем ему нужны какие-то вспомогательные вещи? точнее говоря может и нужны, но только для своего внутреннего представления структуры кода, но в итоговом бинаренике - как будто препроцессор поработал и наделал много copy-paste smile

Цитата(UnrealMan @  14.11.2006,  12:00 Найти цитируемый пост)
полагаю, для разработчиков компиляторов реализация такого – геморрой ещё тот...
ну препроцессор же написали smile





--------------------
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
PM Jabber   Вверх
archimed7592
Дата 15.11.2006, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 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
PM Jabber   Вверх
UnrealMan
Дата 15.11.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  14.11.2006,  23:40 Найти цитируемый пост)
я представляю себе это так: семантически, ф-ция - это набор аргументов + возвращаемое значение. т. е. семантически разницы между f() и obj.f() и pobj->f() нету. 

obj (или *pobj) – это один из аргументов функции, и от этого никуда не денешься.

Цитата(archimed7592 @  14.11.2006,  23:40 Найти цитируемый пост)
т. е. чтобы в шаблоне описывалась только семантика, а реализация подставляется во время компиляции. как в #define...

Ну ты сравнил :-) Директивы препроцессора и шаблоны – это почти совсем разные вещи. Общее у них только то, что с помощью них можно создавать абстракции (а при их объединении можно получить более мощные абстракции).

Цитата(archimed7592 @  14.11.2006,  23:40 Найти цитируемый пост)
все равно компилятор генерит по экземпляру на каждую специализацию. собственно и все чего я хочу

Дело в том, что количество параметров, передаваемых в функцию в данных вариантах

temp_func<f> (...);
temp_func<obj.f> (...);

разное.

Цитата(archimed7592 @  14.11.2006,  23:40 Найти цитируемый пост)
что значит неизвестно? когда ты пишешь f () - все известно. когда пишешь obj.f () - тоже. в шаблоне же, на этапе специализации тоже все известно.

Ну, смотри:

Код
struct A
{
    int n;
    void f() { cout<<n<<endl; }
};

template <void (*pf)()>
    void Func() { pf(); }

int main()
{
    A a;
    a.n = 3;
    Func<a.f>(); // что будет тут?
}

Что будет при вызове функции pf в шаблонной функции Func? Очевидно, для корректного отрабатывания такого вызова нужен объект a. Откуда он возьмётся? Как ни крути, его придётся передавать в качестве отдельного параметра Func (подобно тому, как в вызове a.f() он в качестве отдельного параметра (this) передаётся в функцию f). Реализация шаблона сама должна везде подставлять неявный аргумент a при всяком вызове pf. Сигнатура у pf теперь не соотвествует её действительному статусу: да, используется она как void (pf)(), но в сущности это будет прежняя void (A:smilef)(), переданная как шаблонный аргумент. Это в общем-то серьёзный минус. Что, например, будет, если кто-то вдруг захочет присвоить pf некоторому указателю:

Код
void (*pf_)() = 0;
template <void (*pf)()>
    void Func()
{
    pf();
    pf_ = pf; // чего тут надо делать?
}

Цитата(archimed7592 @  14.11.2006,  23:40 Найти цитируемый пост)
ну вот генерит компилятор конкретную специализацию. он все знает про эту ф-цию. зачем ему нужны какие-то вспомогательные вещи

Ну, про вспомогательную функцию эт я загнул, конечно...

Цитата(archimed7592 @  14.11.2006,  23:40 Найти цитируемый пост)
ну препроцессор же написали 

В препроцессоре идёт банальная обработка на уровне текста программы, чего не скажешь о шаблонах, поэтому сравнивать их в таком контексте как-то неразумно.
PM MAIL   Вверх
archimed7592
Дата 15.11.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  15.11.2006,  11:46 Найти цитируемый пост)
obj (или *pobj) – это один из аргументов функции, и от этого никуда не денешься.
без сомнений. но я же сказал: семантически. ты же конкретно, ручками не передаешь этот аргумент? вот представь, как объясняют это начинающим в школе (или где ещё там)? что мол ф-ция просто исполняется в контексте конкретного объекта. или про ссылки. что это просто "синоним" переменной. так ведь? вот с точки зрения начинающего разницы между вызовом этих двух ф-ций нет:
Код
void func (type arg);
void ref_func (type &arg);
// ...
type var = ...;
func (var);
ref_func (var);
если он конечно не передает константу вместо переменной (но тогда он получает ошибку компиляции - то же самое можно выдать, когда не получается использовать данную ф-ции в этом шаблоне)...
Цитата(UnrealMan @  15.11.2006,  11:46 Найти цитируемый пост)
Что будет при вызове функции pf в шаблонной функции Func? Очевидно, для корректного отрабатывания такого вызова нужен объект a. Откуда он возьмётся? 
ну как откуда. естественно не с потолка smile
значит ещё раз как я себе это представляю: вот есть у наc зашаблоненный qsort. берем и пишем
Код
template<..., F, ...>
qsort (...)
{
    // ...
    F (a, b);
    // ...
}
// ...
qsort<..., func, ...> (...);
qsort<..., ref_func, ...> (...);
qsort<..., obj.func, ...> (...);

что я хочу, чтобы из этого получилось: 3 ф-ции
Код
qsort (...)
{
    // ...
    func (a, b);
    // ...
}

qsort (...)
{
    // ...
    ref_func (a, b);
    // ...
}

qsort (...)
{
    // ...
    obj.func (a, b);
    // ...
}
т. е. обычный копи-пэйст. что же касается контекста thiscall, т. е. того заветного лишнего аргумента - ну как-то он должен передаваться в ф-цию (если она не inline - иначе вопросов вообще никаких не должно быть) средствами компилятора - это уже его проблемы - через стек или через регистры...не суть важно, главное, что проблемы в этом никакой нет.

зы. кстати, насчет передачи this...вот взять какой-нить шаблончик из нэймспейса std и передать ему в качестве аргумента ф-цию из другого нэймспэйса? компилятор же допетривает, что так и так и что это имя из другого нэймспэйса. т. е. как-то он эту ситуацию разруливает. не лучший пример, конечно, но, тем не менее, если задуматься, то семантически разницы между этими вещами большой нету. ну объект, ну нэймспэйс...у нэймспэйса адреса, правда, нету, но это так, мелочи... smile
я отлично понимаю, что звучит все это как-то неубедительно...может даже глупо, но если именно с "глупой" точки зрения на это посмотреть, забыв про тот низкий уровень, где есть разница между 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
PM Jabber   Вверх
Daevaorn
Дата 15.11.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(archimed7592 @  15.11.2006,  13:30 Найти цитируемый пост)
то идея вполне имеет право на жизнь

Имеет. Только толку будет не много. В том варианте, что ты предлагаешь буду куча кодогенирации. Ещё проблема - это контроль времени жизни obj.
Для С++ существует много различных релизаций обобщенных обратных вызовов и делигатов. Поэтому насущей необходимости в добавлении чего-то на подобие это в язык, мне кажется, нет.
PM MAIL WWW   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0865 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.