![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
HappyLife |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 3 Всего: 8 |
Доброго времени суток уважаемые форумчане.
Есть ли такой оператор, который позволил бы в функцию передавать лишь конкретный тип, без неявных преобразований. Например, есть функция: void f(bool Is) { ... } задача заключается в том, чтобы функцию можно было вызвать одним единственным способом, то есть так: f(true) или соответственно f(false), безо всякой возможности вызывать её как-то так: f(10); f(20); f(short(10)); f('a'). |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
HappyLife
например можно вот так поизвращатся ![]()
Это сообщение отредактировал(а) azesmcar - 15.4.2009, 10:32 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
a зачем такое понадобилось ? если не секрет.
![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
![]() В С++ нет такой строгости типов как в Джава. Ничего тут не поделаешь. ![]() Добавлено через 2 минуты и 54 секунды Может задача немного другая на самом деле..а это пример просто? HappyLife посмотрите explicit конструкторы. |
|||
|
||||
Ivanovich |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 31.3.2009 Репутация: нет Всего: нет |
нужен шаблон функции и полная специализация шаблона функции
вывод программы bool template template убирая определение шаблона, оставив только
undefined reference to `void F<int>(int)' undefined reference to `void F<char>(char)' |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ivanovich
Тут больше подходит термин - перегрузка. Это сообщение отредактировал(а) azesmcar - 15.4.2009, 10:52 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
mes
тьфу ![]() тут больше подойдет перегрузка ![]()
эффект тот же, но пишется как обычная функция. |
|||
|
||||
Ivanovich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 31.3.2009 Репутация: нет Всего: нет |
перегрузка шаблона функции != специализация шаблона функции |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ivanovich
Знаю, мой следующий пост посмотри.
|
|||
|
||||
Ivanovich |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 31.3.2009 Репутация: нет Всего: нет |
только надо помнить, что специализации шаблонов функций не перегружают функции и обычная функция void F(bool v) будет вызываться вместо специализации шаблона template<> void F<bool>(bool v)
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ivanovich
ну потому я и предложил только перегружать. Просто выглядет проще и результат в данном случае будет тот же. |
|||
|
||||
Alek86 |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
немного не в тему, но иногда это очень нужно у примеру есть функция, что принимает 2 параметра
а вызов у нее такой:
при том, что есть неявное преобразование из MyClass2 в MyClass1. Но если это преобразование выкинет исключение, то велика вероятность утечки памяти. Потому чтобы еще при проектировании функции func исключить такой шанс, сабж и нужен если функция шаблонная, то в C++ нормальной возможности избавиться от такого варианта нет, потому в бусте делают примерно так
некрасиво, но лучше, чем оставлять дырки в либе Это сообщение отредактировал(а) Alek86 - 15.4.2009, 11:25 |
||||||
|
|||||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Alek86
Сатер описывает подобную ситуацию с std::auto_ptr и по моему лучшее решение этого вопроса не вызывать функцию принимающую std::auto_ptr подобным образом
а написать
Добавлено @ 11:34 правда область видимости тут будет побольше для std::auto_ptr, но если это актуально
даже если избежать утечки памяти так как вы написали, это все равно останется узким местом в программе. Завтра если добавить новый параметр и забыть про это утечка может снова произойти. Это сообщение отредактировал(а) azesmcar - 15.4.2009, 11:36 |
||||||
|
|||||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
azesmcar, ты пишешь либу, в которой есть эта функция
как гарантируешь, что юзер не вызовет ее "неправильно"? или если вызовет, то сам дурак? ![]() тогда уж зачем эта инкапсуляция, айда делать все методы открытыми, а если юзер неуследит и чето не так вызовет, то сам дурак ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |