![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
AtroX |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Задача написать специализацию (или специализации) функции
Которая позволяет делать так:
|
||||
|
|||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
AtroX
Хех... Уже писал, но напишу ещё разок. Уж очень меня это прёт ![]()
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=413508 -------------------- Да. Именно так. |
|||
|
||||
srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
НЕЛЬЗЯ ТАК ДЕЛАТЬ! Кто сказал, что указатель на функцию-член имеет одинаковый размер с обычным указателем? В простейшем случае так и есть, но в случае множественного наследования/виртуальных функций - нет.
Вот пример:
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
AtroX |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
sizeof(void (A::*)(void)) == 12, офигеть!
Ага, обломчик, нельзя так.. Задачка то не тривиальна ![]() Это сообщение отредактировал(а) AtroX - 23.8.2005, 11:22 |
||||
|
|||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
AtroX
Ты уверен, что хочешь иметь именно функцию, которая бы приводила бы указатель на метод к указателю void*? Потому как средствами языка это невозможно (хотя можно с помощью ассемблера). Возможно, вернуть указатель на объект, который будет представлять этот метод, но тогда появляется проблема удаления этого объекта. В STL есть функция mem_fun() которая возвращает объект mem_fun_t, который представляет указетель на метода класса.
-------------------- Волны гасят ветер... |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Ибо нефиг. Я, кстати, об этом догадывался
А вообще Fantasist правильную вещь говорит ![]() -------------------- Да. Именно так. |
||||
|
|||||
AtroX |
|
||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Не надо, без хака все равно не получится. Придется динамически выделять память под функтор, который будет в себе хранить указатель на мембер.
Там всего 0 или 1 переменная может быть - не катит, проще использовать из boost'а или самому написать. |
||||
|
|||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Не понял ни первого ни второго предложения. ![]() Зачем надо динамически выделять память под функтор?
Можно, конечно, просто в соседней ветке ты написал тоже только для одного/двух параметров фактически переписав STL. А самому писать не стоит - boost вскоре тоже собираются в стандарт включать. -------------------- Волны гасят ветер... |
||||
|
|||||
AtroX |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Не надо к void* приводить, плохая это идея =))
Иногда стоит, когда не хочешь подключать всю библиотеку(ну или часть).
Чтобы хранить в этом функторе нормальный указатель на мембер, раз я не знаю его размера. Как и сделано в соседней ветке.
У меня у функторов общий базовый класс, что важно и чего нет в STL. Для одного и двух пар-ров я сделал только для примера, а вообще реально нужно около 4х. |
||||||||
|
|||||||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Не знаю, подойдет ли тебе это, но функтор можно, и, имхо, нужно передавать по значению. Так же, если нужна общность функторов для разного типа и количества аргументов, и без наследования, советую присмотреться к Loki::Functor --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
AtroX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 18.8.2005 Репутация: нет Всего: нет |
Мне нужен массив функторов, так что тут не обойдешься без динамического выделения памяти... Это сообщение отредактировал(а) AtroX - 24.8.2005, 16:32 |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
-------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |