URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5411
[ Назад ]

Исходное сообщение
"object::*function"

Отправлено kir , 10-Май-06 17:17 

собственно сабж
можно ли в С++ обьявить универсальный указатель на функцию? не используя наследования

Содержание

Сообщения в этом обсуждении
"object::*function"
Отправлено ViRuZzz , 10-Май-06 18:03 
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования
void*

"object::*function"
Отправлено kir , 12-Май-06 16:45 
>> собственно сабж
>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>void*

)))))) с каких это пор??
PS: нет некатит


"object::*function"
Отправлено DeadMustdie , 13-Май-06 00:08 
>void*
void* нельзя. Размер void* и размер указателя на функцию совпадать не обязаны.
А вот что-то типа typedef void (*FuncPtrType)(void); прокатит.
Только сплошные приведения типов будут.

"object::*function"
Отправлено perece , 03-Июл-06 19:35 
>>void*
>void* нельзя. Размер void* и размер указателя на функцию совпадать не обязаны.
с каких это фигов? с чего это у меня при 32битных адресах данных адреса кода будут 64битные, или наоборот?
возможно, можно припомнить какие-нть доисторические платформы, где память под код и под данные была разделена (физически), но я надеюсь, что речь не идет о такой экзотике.
касты void * к указателю на ф-ию использовал неоднократно - никаких проблем. на x86, i64, mips, arm и sparc по крайней мере. на других - не знаю.

"object::*function"
Отправлено DeadMustdie , 03-Июл-06 20:52 
>с каких это фигов? с чего это у меня при 32битных адресах
>данных адреса кода будут 64битные, или наоборот?

Наоборот. Бывают платформы с адресацией кода 32-битным указателем
(вряд ли кому-то не хватит), и с адресацией данных 64-битным.
Значительно экономится память и упрощается контроль над корректностью
адресов.

>возможно, можно припомнить какие-нть доисторические платформы, где память под код и под
>данные была разделена (физически), но я надеюсь, что речь не идет о такой экзотике.

Экзотика, но вполне современная. Я сам, правда, не видел. Деление не физическое,
а логическое, поддерживаемое MMU.

>касты void * к указателю на ф-ию использовал неоднократно - никаких проблем.
>на x86, i64, mips, arm и sparc по крайней мере. на других - не знаю.

На любой POSIX-платформе прокатит. Стандарт языка C существенно шире, и многие
POSIX-ные ограничения в нем не действуют.


"object::*function"
Отправлено michelnok , 04-Июл-06 20:56 
>Наоборот. Бывают платформы с адресацией кода 32-битным указателем
>(вряд ли кому-то не хватит), и с адресацией данных 64-битным.
>Значительно экономится память и упрощается контроль над корректностью
>адресов.

Ого, ничего себе упрощает. Скорее добавляет гемора, нежели упрощает. И я себе представляю, какой получается процент экономии памяти на указателях на код (!), учитывая что платформа явно предназначена для работы с огромными кусками данных, бОльшими чем 4ГБ... ;-)


"object::*function"
Отправлено guest , 13-Май-06 00:20 
>
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования


union my_func_type {
    void (*func_vv)();
    void (*func_vi)(int arg);
    int (*func_iv) ();
    /* и так далее, пока не перечислишь все варианты */
};


"object::*function"
Отправлено kir , 15-Май-06 14:16 
вообще имелась ввиду обектаная функция
собственно сабж так и звучит
и я спросил как обявить указатель на обьектную функцию не используя наследовани
я
тоесть если можно сказать Универсальный указатель
из моих знаний могу предположить что нельзя...
но хотел проконсультироваться)) а вдруг я чего то незнаю

>>
>> собственно сабж
>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>
>
>union my_func_type {
>    void (*func_vv)();
>    void (*func_vi)(int arg);
>    int (*func_iv) ();
>    /* и так далее, пока не перечислишь все
>варианты */
>};



"object::*function"
Отправлено sasha , 15-Май-06 16:40 
http://boost.org/doc/html/function.html
Это не указатель, но может пригодится :)

"object::*function"
Отправлено michelnok , 15-Май-06 17:00 
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования

Универсальный - нет. В пределах класса и его потомков - вполне.


"object::*function"
Отправлено kir , 15-Май-06 17:09 

вроде когда компилятор создает обект он конструирует их из заранее определенных классов типа ___rtti_si ... или чтто в таком духе - как то заюзать это нельзя?

>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>
>Универсальный - нет. В пределах класса и его потомков - вполне.



"object::*function"
Отправлено kir , 01-Июл-06 15:27 
>
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования


отвечаю сам себе
как оказываеться все можно.


"object::*function"
Отправлено michelnok , 02-Июл-06 20:09 
>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>
>отвечаю сам себе
>как оказываеться все можно.

И как?


"object::*function"
Отправлено bf_ , 12-Июл-06 17:42 
>>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>>наследования
>>
>>отвечаю сам себе
>>как оказываеться все можно.
>
>И как?

Видимо никак :)
Не дождался...Как я делал то, что спрашивал автор поста или как я сам это интерпретировал...

В любом случае делается базовый класс:

class IEventObject {
public:
       virtual Result eventFunction( Event* const ) = 0;
};

typedef Result (IEventObject::*eventFuncPtr_t)( Event* const );

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

class SomeProcessor {
protected:
vector< pair< IEventObject*, eventFuncPtr_t > > m_eventTable;
public:
void sendEvent( Event* evt ) {
// итерация, проверки и т.п., и что-то вроде
Result res = ( itr->first->*itr->second )( evt );
}

Но, как это видно - всё работает только для наследованных объектов...Как же в плюсах выглядит универсальный(!) указатель на любой(!) объект...не знаю...не постиг ещё...Наверное это что-то вроде:
template< typename _TObject, typename _TFunction >... не знаю вообщем...


"object::*function"
Отправлено kit , 12-Июл-06 19:53 
нет универсальный указатель создать можно и вызывать его тоже

задача на самостоятельную проработку из класса домашних заданий :)


"object::*function"
Отправлено Ф , 13-Июл-06 09:36 
>
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования

Вот статейка
http://www.rsdn.ru/article/cpp/fastdelegate.xml


"object::*function"
Отправлено kir , 14-Июл-06 12:18 
бред а не статейка
универсальный указатель обявить можно
он работает нормально
проверено на gcc и VC60



"object::*function"
Отправлено Ф , 14-Июл-06 14:15 
>универсальный указатель обявить можно
>он работает нормально
>проверено на gcc и VC60

Как??


"object::*function"
Отправлено bf_ , 15-Июл-06 15:05 
>>универсальный указатель обявить можно
>>он работает нормально
>>проверено на gcc и VC60
>
>Как??

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