![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Есть немного странная задача.
Нужно создать класс (на основе шаблонов) который мог бы вызывать функции 2 типов. 1 тип - обычная функция 2 тип - метод класса например
и
только вот зотелось бы с помощью шаблонов создать один класс, который в конструкторе будет принимать указатель либо на фуннкцию, либо на метод - ну и соответственно дергать нужную |
||||
|
|||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Метод в лоб, пишу на коленке, выдумывать элегантное решение в лом
Думаю идея понятна ![]() Это сообщение отредактировал(а) Mayk - 17.12.2005, 19:52 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Mayk, спасибо - хорошее решение
а что - можешь еще лучше предложить ![]() |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Могу предложить попробовать обойтись без использования доп классов. Правда это нечитабельнее
Что-то типа (часть кода за вызов ф-ции и очевидный деструктор опущу)
Не сказал бы что это лучше :-) Вывод - очевидные решения предпочтительнее неочевидных ![]() Это сообщение отредактировал(а) Mayk - 17.12.2005, 20:28 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Mayk, что-то никак не соберу
не хочет так ![]() Это сообщение отредактировал(а) zss - 17.12.2005, 21:15 |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Почитай сообщения об ошибках
![]()
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Mayk, я так понимаю ты подправил
мой косяк - упустил ![]()
говорит, что не может конвертнуть StaticCaller* в Callerimpl* - странно ... |
||||
|
|||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
g++ ругался, что arg_ не найден. Добавлено @ 22:15 Стоп. Понял.
Так нельзя - arg_ принадлежит базовому классу, который УЖЕ проинициализирован. => инициализировать его нельзя -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
значит придется заводить arg_ для каждого наследника ? З.Ы. Попробовал - не прокатило Это сообщение отредактировал(а) zss - 17.12.2005, 22:21 |
|||
|
||||
Mayk |
|
||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Не обязательно
Вот это работает ![]() Добавлено @ 22:24
компилятор даже знает почему -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||
|
|||||||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
это ошибки из-за большого количества спиртного
![]()
говорит
|
||||
|
|||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Ну и зачем? arg_ нельзя инициализировать. Он уже инициализирован в базовом классе. => надо писать arg_=arg, как и было раньше.
где говорит? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
|
||||
|
|||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Замени private наследование на public
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Mayk, спасибо - вроде собралось
![]() Еще вопрос - эти 2 конструктора придется всегда за собой таскать и для порожденных классов ? Если да - то можно ли что-нибудь придумать (чтоб не таскать - хотя есть большие подозрения, что нельзя ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Если это не учебная задача, а практическая, лучше использовать готовое решение, например boost::function + boost::bind.
Все-таки это чисто техническая задача, и тратить время на ее решение (когда она уже решена так мощно, как в бусте), не целесообразно. Стоит только посмотреть на бустовский код, чтобы понять трудозатраты на разработку подобных вещей... Не обязательно использовать именно boost, есть еще Loki и другие подобные библиотеки. -------------------- ... |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
да вроде результат достигнут.
а по boosr у меня нет инфы |
|||
|
||||
ParaPik |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Добрый вечер.
У меня один пробел остался с использованием шаблонов. Даже в книгах Страуструпа не нашел ответа. Я хочу спецализировать конструктор в классе. Я могу написать вот так:
Но если пишу так:
компилятор пишет, что нужно написать специализацию всего класса. Пожалуйста поясните, как можно быстрее. |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Здравствуйте, добро пожаловать на форум!
частичная специализацию функций запрещена(если мне память не изменяет). Это сообщение отредактировал(а) vinter - 8.1.2009, 19:00 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Т.е. либо специализировать полностью функцию, либо специализировать весь класс. А случайно никто не знает, почему Страуструп решил так спроектировать использование шаблонов?(какова причина)
|
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Как я понимаю таких данных ни у кого нет. А случайно в стандарте не будет ответа на мой вопрос?
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
проще всего посмотреть самому, чем ждать, что это сделают за тебя.
С++ сейчас не является полностью творением Страуструпа, над С++ работает целый комитет по стандартизации. Если я ничег не путаю, то отсутсвие часьтичной специализации функций это недоразумение которое будет исправлено в С++09 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вероятно опять неправильно оценили высказывание: оно не говорит, что перегрузка заменит во всем специализацию, а о том, что при разработке автоматизацию следует искать в перегрузке, а не частичной специализации. И подход соответсвенно надо выбирать соответствующий. ![]() Это сообщение отредактировал(а) mes - 10.1.2009, 13:37 |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Нельзя ли точней указать на тот момент, который вы подвергаете сомнению - иначе боюсь мы будем обсуждать разное. |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Я не ответил, потому что не понял, о чем конкретно Вы спрашивуете ![]() Исходя из вышесказанного, я лишь могу ответить : прямого цитирования чего либо там не было. Добавлено через 1 минуту и 18 секунд Ну а показать, где неясности в высказываниях возможно ? |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Я спрашивал о том, что утверждалось в процитированном тексте. Или там ничего не утверждалось? ![]()
Какую автоматизацию? Вот так твоя писанина выглядит со стороны: "при разработке бла-бла-бла следует искать в перегрузке, а не частичной специализации. И подход соответсвенно надо выбирать соответствующий." Я могу лишь читать текст, который ты пишешь, но не могу угадывать твои мысли. Бесплатный совет: если хочешь, чтоб тебя понимали, при выражении своих мыслей в тексте попробуй поставить себя на место читателя, который не осведомлён насчёт твоих заморочек, потому что о них может быть известно только тебе. Это сообщение отредактировал(а) UnrealMan - 10.1.2009, 21:14 |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Ну, во первых, хватит оффтопить. Как никак мы здесь шаблоны обсуждаем.
vinter, ты не мог сказать откуда у тебя сведения о С++09. Может ссылку кинешь. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Можете мне не верить, но я всегда стараюсь (и учусь) подобрать выражение и исправиться сли поняли меня не корректно. ![]()
на этом основание я отнес шаблоны, специализацию, и перегрузку к средствам автоматизации. И имхо не только я, потму что употребления этого слова (автоматизация) в таком контексте встречалась не раз как в литературе, так и на форумах. Цитата с автоматизацией была пояснящая предыдущую цитату.. но к сожаление ей не удалось выполнить задачу ![]() Основная цитата эта : Попробую перефразировать еще раз : Когда нужно шаблонной функции задать определенное поведение , для определенных типов параметров, то за неимением частичной специализации, можно попытаться найти решение с помощью перегрузки. ![]() Добавлено через 3 минуты и 26 секунд
Так вроде как раз по теме. Идет обсуждение на правильность одного из ответов. ![]() |
||||
|
|||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Замечательно. Только вот смысл той фразы от этого как-то не проясняется. Ну, это совсем не то же самое, что "Используйте" и "рассмотрите вариант с использованием" - не одно и то же. Вместо частичной специализации функции можно рассмотреть вариант с использованием частичной специализации вспомогательного класса, функция-член которого будет содержать всю необходимую реализацию:
Тоже вполне известный подход наравне с перегрузкой. Это сообщение отредактировал(а) UnrealMan - 11.1.2009, 04:26 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Спасибо, vinter. Наверное, все таки обсуждение по поводу корректного написания сообщений в тему не оффтоп.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |