|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.12.2010, 23:31 | #1 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
шаблонные функции, как помочь компилятору выбрать определенную.
в общем такая ситуация:
Код:
или никак? ну или хотя бы, можно компилю сказать что объекты произвольные от опред класса надо обрабатывать иначе? ЗЫ:кстати маленький вопрос, это нормальное организация оператора или можно void ставить как тип возврата?(в принципе думаю что можно, ведь будет Stream<<T, а не Stream=Stream<<T, но хочу узнать мнение опытных) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 05.12.2010 в 23:52. |
05.12.2010, 23:43 | #2 | |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Сигнатуры у функций полностью идентичны, поэтому такой код будет считаться ошибкой. Если уж так хочется выбирать из двух вариантов, то либо делайте функции с разной сигнатурой, либо логику выбора засовывайте внутрь тела функции. Хотя я вообще не уверен в безопасности и предсказуемости такого подхода.
Цитата:
Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|
05.12.2010, 23:51 | #3 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
мне нужно знать будет на этапе компиляции, есть ли у объекта o метод SaveToStream... у меня есть лишь один вариант, он наверно верный. Код:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
05.12.2010, 23:56 | #4 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
Такое возможно. За примером можно сходить к саттеру. у него есть глава о требовании наличия ф-ии члена у класса. Это свойство класса определяется на этапе компиляции.
|
05.12.2010, 23:58 | #5 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
эммм...к кому сходить?
я понимаю что в итоге сведется похоже к #if #else #endif, но какое условие? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
06.12.2010, 00:04 | #6 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
нет. макросов там не будет. У Саттера в Решения сложных задач есть правильная глава. Она так и называется: Требования наличия функций-членов.
|
06.12.2010, 00:12 | #7 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
я может чего то не понимаю, но почему нельзя специадизировать шаблон? на объект, у которого есть метод savetostream вызывать соответствующуу функцию, на все другие - write
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
06.12.2010, 00:13 | #8 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
и мне для каждого класса писать специализацию?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
06.12.2010, 00:20 | #9 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
Я вот по памяти накидал один из возможных вариантов. не компилил это да и не доделанный он. Тут главное идею уловить.
Код:
О том, как это продетектить в компайлтайме я уже сказал где можно посмотреть. Возможны и другие реализации. это лишь одна из. В бусте также есть классы, которые определяют свойства других классов. Возможно там уже есть готовый детектор. |
06.12.2010, 00:27 | #10 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
вообще в вашем случае стоит пойти немного другим путем. сделать так, как сделано в стл. а именно. там есть std:stream, у которого есть метод write или похожая. еще есть стандартная шаблонная ф-ия std:stream <<, которая реализована по умолчанию для всех плоских типов. но если вы пишите класс и хотите чтобы он записывался в стрим стандартным синтаксисом, то вы реализуете свою нешаблонную ф-ию operator <<, которая в качестве аргумента кроме стрима принимает именно ваш класс.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Шаблонные функции в классе | Impuls1989 | Общие вопросы C/C++ | 5 | 20.09.2010 09:04 |
Почему нельзя разбивать на отдельные файлы шаблонные функции и классы? | lordius | Visual C++ | 22 | 08.07.2010 09:49 |
Как удалить определенную страницу? | Мультипликатор | Microsoft Office Word | 1 | 28.06.2010 17:39 |
шаблонные строковые функции | MrKarapuz | Общие вопросы C/C++ | 7 | 09.11.2009 15:07 |
Как напечатать определенную страницу | k1r1ch | Microsoft Office Excel | 14 | 10.07.2009 18:29 |