Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Шаблон класса |
Автор: zss 17.12.2005, 19:28 | ||||
Есть немного странная задача. Нужно создать класс (на основе шаблонов) который мог бы вызывать функции 2 типов. 1 тип - обычная функция 2 тип - метод класса например
и
только вот зотелось бы с помощью шаблонов создать один класс, который в конструкторе будет принимать указатель либо на фуннкцию, либо на метод - ну и соответственно дергать нужную |
Автор: Mayk 17.12.2005, 19:50 | ||
Метод в лоб, пишу на коленке, выдумывать элегантное решение в лом
Думаю идея понятна ![]() |
Автор: zss 17.12.2005, 20:04 | ||
Mayk, спасибо - хорошее решение
а что - можешь еще лучше предложить ![]() |
Автор: Mayk 17.12.2005, 20:24 | ||
Могу предложить попробовать обойтись без использования доп классов. Правда это нечитабельнее Что-то типа (часть кода за вызов ф-ции и очевидный деструктор опущу)
Не сказал бы что это лучше :-) Вывод - очевидные решения предпочтительнее неочевидных ![]() |
Автор: zss 17.12.2005, 21:12 | ||
Mayk, что-то никак не соберу
не хочет так ![]() |
Автор: Mayk 17.12.2005, 21:54 | ||
Почитай сообщения об ошибках ![]()
|
Автор: zss 17.12.2005, 22:11 | ||||
Mayk, я так понимаю ты подправил
мой косяк - упустил ![]()
говорит, что не может конвертнуть StaticCaller* в Callerimpl* - странно ... |
Автор: Mayk 17.12.2005, 22:13 | ||||
g++ ругался, что arg_ не найден. Добавлено @ 22:15 Стоп. Понял.
Так нельзя - arg_ принадлежит базовому классу, который УЖЕ проинициализирован. => инициализировать его нельзя |
Автор: zss 17.12.2005, 22:18 | ||
значит придется заводить arg_ для каждого наследника ? З.Ы. Попробовал - не прокатило |
Автор: Mayk 17.12.2005, 22:21 | ||||||||
Не обязательно
Вот это работает ![]() Добавлено @ 22:24
компилятор даже знает почему |
Автор: zss 17.12.2005, 22:33 | ||||
это ошибки из-за большого количества спиртного ![]()
говорит
|
Автор: Mayk 17.12.2005, 22:42 | ||||
Ну и зачем? arg_ нельзя инициализировать. Он уже инициализирован в базовом классе. => надо писать arg_=arg, как и было раньше.
где говорит? |
Автор: zss 17.12.2005, 22:51 | ||||
|
Автор: Mayk 17.12.2005, 23:41 |
Замени private наследование на public |
Автор: zss 18.12.2005, 17:49 |
Mayk, спасибо - вроде собралось ![]() Еще вопрос - эти 2 конструктора придется всегда за собой таскать и для порожденных классов ? Если да - то можно ли что-нибудь придумать (чтоб не таскать - хотя есть большие подозрения, что нельзя ![]() |
Автор: Earnest 19.12.2005, 17:04 |
Если это не учебная задача, а практическая, лучше использовать готовое решение, например boost::function + boost::bind. Все-таки это чисто техническая задача, и тратить время на ее решение (когда она уже решена так мощно, как в бусте), не целесообразно. Стоит только посмотреть на бустовский код, чтобы понять трудозатраты на разработку подобных вещей... Не обязательно использовать именно boost, есть еще Loki и другие подобные библиотеки. |
Автор: zss 19.12.2005, 20:29 |
да вроде результат достигнут. а по boosr у меня нет инфы |
Автор: ParaPik 8.1.2009, 18:09 | ||||
Добрый вечер. У меня один пробел остался с использованием шаблонов. Даже в книгах Страуструпа не нашел ответа. Я хочу спецализировать конструктор в классе. Я могу написать вот так:
Но если пишу так:
компилятор пишет, что нужно написать специализацию всего класса. Пожалуйста поясните, как можно быстрее. |
Автор: vinter 8.1.2009, 19:00 |
Здравствуйте, добро пожаловать на форум! частичная специализацию функций запрещена(если мне память не изменяет). |
Автор: mes 8.1.2009, 19:02 | ||
используйте перегрузку, вместо частичной специализации |
Автор: UnrealMan 8.1.2009, 21:07 | ||
Гениальный совет ![]() Покажи же, как сие чудо будет выглядеть применительно к
|
Автор: ParaPik 8.1.2009, 22:39 |
Т.е. либо специализировать полностью функцию, либо специализировать весь класс. А случайно никто не знает, почему Страуструп решил так спроектировать использование шаблонов?(какова причина) |
Автор: ParaPik 10.1.2009, 12:23 |
Как я понимаю таких данных ни у кого нет. А случайно в стандарте не будет ответа на мой вопрос? |
Автор: mes 10.1.2009, 13:36 |
Вероятно опять неправильно оценили высказывание: оно не говорит, что перегрузка заменит во всем специализацию, а о том, что при разработке автоматизацию следует искать в перегрузке, а не частичной специализации. И подход соответсвенно надо выбирать соответствующий. ![]() |
Автор: UnrealMan 10.1.2009, 15:10 | ||
Это ты сам придумал или вычитал из какой-нибудь статьи под названием "Советы пьяного ёжика"? |
Автор: mes 10.1.2009, 15:21 |
Нельзя ли точней указать на тот момент, который вы подвергаете сомнению - иначе боюсь мы будем обсуждать разное. |
Автор: UnrealMan 10.1.2009, 16:04 | ||
Я могу подвергать сомнению только утверждения, смысл которых мне полностью ясен. Ты так и не ответил на мой вопрос. |
Автор: mes 10.1.2009, 19:45 |
Я не ответил, потому что не понял, о чем конкретно Вы спрашивуете ![]() Исходя из вышесказанного, я лишь могу ответить : прямого цитирования чего либо там не было. Добавлено через 1 минуту и 18 секунд Ну а показать, где неясности в высказываниях возможно ? |
Автор: UnrealMan 10.1.2009, 20:52 | ||
Я спрашивал о том, что утверждалось в процитированном тексте. Или там ничего не утверждалось? ![]()
Какую автоматизацию? Вот так твоя писанина выглядит со стороны: "при разработке бла-бла-бла следует искать в перегрузке, а не частичной специализации. И подход соответсвенно надо выбирать соответствующий." Я могу лишь читать текст, который ты пишешь, но не могу угадывать твои мысли. Бесплатный совет: если хочешь, чтоб тебя понимали, при выражении своих мыслей в тексте попробуй поставить себя на место читателя, который не осведомлён насчёт твоих заморочек, потому что о них может быть известно только тебе. |
Автор: ParaPik 10.1.2009, 22:18 |
Ну, во первых, хватит оффтопить. Как никак мы здесь шаблоны обсуждаем. vinter, ты не мог сказать откуда у тебя сведения о С++09. Может ссылку кинешь. |
Автор: vinter 10.1.2009, 22:23 |
http://www.open-std.org/JTC1/SC22/WG21/ оригинал обсуждения: http://habrahabr.ru/blogs/cpp/25330/ http://forum.sources.ru/index.php?showtopic=190375&st=0 |
Автор: mes 11.1.2009, 02:58 | ||||||
Можете мне не верить, но я всегда стараюсь (и учусь) подобрать выражение и исправиться сли поняли меня не корректно. ![]()
на этом основание я отнес шаблоны, специализацию, и перегрузку к средствам автоматизации. И имхо не только я, потму что употребления этого слова (автоматизация) в таком контексте встречалась не раз как в литературе, так и на форумах. Цитата с автоматизацией была пояснящая предыдущую цитату.. но к сожаление ей не удалось выполнить задачу ![]() Основная цитата эта : Попробую перефразировать еще раз : Когда нужно шаблонной функции задать определенное поведение , для определенных типов параметров, то за неимением частичной специализации, можно попытаться найти решение с помощью перегрузки. ![]() Добавлено через 3 минуты и 26 секунд
Так вроде как раз по теме. Идет обсуждение на правильность одного из ответов. ![]() |
Автор: UnrealMan 11.1.2009, 04:11 | ||||||
Замечательно. Только вот смысл той фразы от этого как-то не проясняется.
Ну, это совсем не то же самое, что "Используйте" и "рассмотрите вариант с использованием" - не одно и то же. Вместо частичной специализации функции можно рассмотреть вариант с использованием частичной специализации вспомогательного класса, функция-член которого будет содержать всю необходимую реализацию:
Тоже вполне известный подход наравне с перегрузкой. |
Автор: mes 11.1.2009, 04:41 | ||
Постараюсь более точно подбирать глаголы ![]() А все таки хорошо, что на фоурме есть такой придирчивый к словам человек ![]() |
Автор: ParaPik 11.1.2009, 09:34 |
Спасибо, vinter. Наверное, все таки обсуждение по поводу корректного написания сообщений в тему не оффтоп. |