Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Приведение указателя на функцию-член к void* |
Автор: AtroX 22.8.2005, 23:27 | ||||
Задача написать специализацию (или специализации) функции
Которая позволяет делать так:
|
Автор: Дрон 22.8.2005, 23:59 | ||
AtroX Хех... Уже писал, но напишу ещё разок. Уж очень меня это прёт ![]()
http://forum.vingrad.ru/index.php?showtopic=52386&view=findpost&p=413508 |
Автор: srd 23.8.2005, 04:54 | ||
НЕЛЬЗЯ ТАК ДЕЛАТЬ! Кто сказал, что указатель на функцию-член имеет одинаковый размер с обычным указателем? В простейшем случае так и есть, но в случае множественного наследования/виртуальных функций - нет. Вот пример:
|
Автор: AtroX 23.8.2005, 11:05 | ||||
sizeof(void (A::*)(void)) == 12, офигеть!
Ага, обломчик, нельзя так.. Задачка то не тривиальна ![]() |
Автор: Fantasist 23.8.2005, 12:13 | ||
AtroX Ты уверен, что хочешь иметь именно функцию, которая бы приводила бы указатель на метод к указателю void*? Потому как средствами языка это невозможно (хотя можно с помощью ассемблера). Возможно, вернуть указатель на объект, который будет представлять этот метод, но тогда появляется проблема удаления этого объекта. В STL есть функция mem_fun() которая возвращает объект mem_fun_t, который представляет указетель на метода класса.
|
Автор: Дрон 23.8.2005, 12:41 | ||||
Ибо нефиг. Я, кстати, об этом догадывался
А вообще Fantasist правильную вещь говорит ![]() |
Автор: AtroX 23.8.2005, 17:47 | ||||
Не надо, без хака все равно не получится. Придется динамически выделять память под функтор, который будет в себе хранить указатель на мембер.
Там всего 0 или 1 переменная может быть - не катит, проще использовать из boost'а или самому написать. |
Автор: Fantasist 23.8.2005, 18:40 | ||||
Не понял ни первого ни второго предложения. ![]() Зачем надо динамически выделять память под функтор?
Можно, конечно, просто в соседней ветке ты написал тоже только для одного/двух параметров фактически переписав STL. А самому писать не стоит - boost вскоре тоже собираются в стандарт включать. |
Автор: AtroX 23.8.2005, 20:00 | ||||||||
Не надо к void* приводить, плохая это идея =))
Иногда стоит, когда не хочешь подключать всю библиотеку(ну или часть).
Чтобы хранить в этом функторе нормальный указатель на мембер, раз я не знаю его размера. Как и сделано в соседней ветке.
У меня у функторов общий базовый класс, что важно и чего нет в STL. Для одного и двух пар-ров я сделал только для примера, а вообще реально нужно около 4х. |
Автор: Chaos A.D. 24.8.2005, 09:15 | ||
Не знаю, подойдет ли тебе это, но функтор можно, и, имхо, нужно передавать по значению. Так же, если нужна общность функторов для разного типа и количества аргументов, и без наследования, советую присмотреться к Loki::Functor |
Автор: AtroX 24.8.2005, 16:32 | ||
Мне нужен массив функторов, так что тут не обойдешься без динамического выделения памяти... |
Автор: Nastya 24.8.2005, 17:39 |
http://www.rsdn.ru/article/cpp/fastdelegate.xml |