собственно сабж
можно ли в С++ обьявить универсальный указатель на функцию? не используя наследования
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования
void*
>> собственно сабж
>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>void*)))))) с каких это пор??
PS: нет некатит
>void*
void* нельзя. Размер void* и размер указателя на функцию совпадать не обязаны.
А вот что-то типа typedef void (*FuncPtrType)(void); прокатит.
Только сплошные приведения типов будут.
>>void*
>void* нельзя. Размер void* и размер указателя на функцию совпадать не обязаны.
с каких это фигов? с чего это у меня при 32битных адресах данных адреса кода будут 64битные, или наоборот?
возможно, можно припомнить какие-нть доисторические платформы, где память под код и под данные была разделена (физически), но я надеюсь, что речь не идет о такой экзотике.
касты void * к указателю на ф-ию использовал неоднократно - никаких проблем. на x86, i64, mips, arm и sparc по крайней мере. на других - не знаю.
>с каких это фигов? с чего это у меня при 32битных адресах
>данных адреса кода будут 64битные, или наоборот?Наоборот. Бывают платформы с адресацией кода 32-битным указателем
(вряд ли кому-то не хватит), и с адресацией данных 64-битным.
Значительно экономится память и упрощается контроль над корректностью
адресов.>возможно, можно припомнить какие-нть доисторические платформы, где память под код и под
>данные была разделена (физически), но я надеюсь, что речь не идет о такой экзотике.Экзотика, но вполне современная. Я сам, правда, не видел. Деление не физическое,
а логическое, поддерживаемое MMU.>касты void * к указателю на ф-ию использовал неоднократно - никаких проблем.
>на x86, i64, mips, arm и sparc по крайней мере. на других - не знаю.На любой POSIX-платформе прокатит. Стандарт языка C существенно шире, и многие
POSIX-ные ограничения в нем не действуют.
>Наоборот. Бывают платформы с адресацией кода 32-битным указателем
>(вряд ли кому-то не хватит), и с адресацией данных 64-битным.
>Значительно экономится память и упрощается контроль над корректностью
>адресов.Ого, ничего себе упрощает. Скорее добавляет гемора, нежели упрощает. И я себе представляю, какой получается процент экономии памяти на указателях на код (!), учитывая что платформа явно предназначена для работы с огромными кусками данных, бОльшими чем 4ГБ... ;-)
>
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования
union my_func_type {
void (*func_vv)();
void (*func_vi)(int arg);
int (*func_iv) ();
/* и так далее, пока не перечислишь все варианты */
};
вообще имелась ввиду обектаная функция
собственно сабж так и звучит
и я спросил как обявить указатель на обьектную функцию не используя наследовани
я
тоесть если можно сказать Универсальный указатель
из моих знаний могу предположить что нельзя...
но хотел проконсультироваться)) а вдруг я чего то незнаю>>
>> собственно сабж
>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>
>
>union my_func_type {
> void (*func_vv)();
> void (*func_vi)(int arg);
> int (*func_iv) ();
> /* и так далее, пока не перечислишь все
>варианты */
>};
http://boost.org/doc/html/function.html
Это не указатель, но может пригодится :)
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследованияУниверсальный - нет. В пределах класса и его потомков - вполне.
вроде когда компилятор создает обект он конструирует их из заранее определенных классов типа ___rtti_si ... или чтто в таком духе - как то заюзать это нельзя?>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>
>Универсальный - нет. В пределах класса и его потомков - вполне.
>
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследования
отвечаю сам себе
как оказываеться все можно.
>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>наследования
>
>отвечаю сам себе
>как оказываеться все можно.И как?
>>> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>>>наследования
>>
>>отвечаю сам себе
>>как оказываеться все можно.
>
>И как?Видимо никак :)
Не дождался...Как я делал то, что спрашивал автор поста или как я сам это интерпретировал...В любом случае делается базовый класс:
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 >... не знаю вообщем...
нет универсальный указатель создать можно и вызывать его тожезадача на самостоятельную проработку из класса домашних заданий :)
>
> собственно сабж
> можно ли в С++ обьявить универсальный указатель на функцию? не используя
>наследованияВот статейка
http://www.rsdn.ru/article/cpp/fastdelegate.xml
бред а не статейка
универсальный указатель обявить можно
он работает нормально
проверено на gcc и VC60
>универсальный указатель обявить можно
>он работает нормально
>проверено на gcc и VC60Как??
>>универсальный указатель обявить можно
>>он работает нормально
>>проверено на gcc и VC60
>
>Как??Тайна универсального указателя тщательно скрывается местными "гуру"...такие вопросы не прокатят - максимум что скажут, это ссылка на статью студента, открывшего для себя делегирование и как реализован механизм вызовов...