Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть ли такой оператор: 
:(
    Опции темы
HappyLife
Дата 15.4.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Доброго времени суток уважаемые форумчане.
Есть ли такой оператор, который позволил бы в функцию передавать лишь конкретный тип, без неявных преобразований.
Например, есть функция:

void f(bool Is)
{
...
}


задача заключается в том, чтобы функцию можно было вызвать одним единственным способом, то есть так:
f(true) или соответственно f(false), безо всякой возможности вызывать её как-то так:
f(10); f(20); f(short(10)); f('a').



PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



HappyLife

например можно вот так поизвращатся smile 
Код

template <class T>
class wrapper
{
public:
    wrapper(const T& arg): arg_( arg ) {}

    operator T() const {
        return arg_;
    }
private:
    template <class U> wrapper(const U&);
    T arg_;
};

typedef wrapper<bool> wbool;

void foo(wbool is)
{
}

int main()
{
    foo( 5 ); //cannot access private member
    foo( true ); //OK
}



Это сообщение отредактировал(а) azesmcar - 15.4.2009, 10:32
PM   Вверх
mes
Дата 15.4.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



a зачем такое понадобилось ? если не секрет.  smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.4.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

a зачем такое понадобилось ? если не секрет.  smile  

 smile да да..мне тоже интересно.
В С++ нет такой строгости типов как в Джава. Ничего тут не поделаешь. smile

Добавлено через 2 минуты и 54 секунды
Может задача немного другая на самом деле..а это пример просто?
HappyLife посмотрите explicit конструкторы.
PM   Вверх
Ivanovich
Дата 15.4.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 31.3.2009

Репутация: нет
Всего: нет



нужен шаблон функции и полная специализация шаблона функции
Код

#include <iostream>

using namespace std;

template<typename T> void F(T v)
{
    cout << "template" << endl;
}

template<> void F<bool>(bool v)
{
    cout << "bool " << endl;
}

int main(int argc, char *argv[])
{
    F(true);
    F(30);
    F('w');
}



вывод программы

bool
template
template

убирая определение шаблона, оставив только 
Код

template<typename T> void F(T v); 
 получаются требуемые ошибки компиляции
undefined reference to `void F<int>(int)'
undefined reference to `void F<char>(char)'




PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Ivanovich

Тут больше подходит термин - перегрузка.

Это сообщение отредактировал(а) azesmcar - 15.4.2009, 10:52
PM   Вверх
mes
Дата 15.4.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  15.4.2009,  09:50 Найти цитируемый пост)
Тут больше подходит термин - перегрузка.


Цитата(Ivanovich @  15.4.2009,  09:38 Найти цитируемый пост)
template<typename T> void F(T v);
template<> void F<bool>(bool v)
{
    cout << "bool " << endl;
}

Код

template<typename T> void F(T v);
void F(bool v)
{
    cout << "bool " << endl;
}



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 15.4.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



mes
тьфу smile не термин..
тут больше подойдет перегрузка smile
Код

template<typename T> void F(T v)
{
    cout << "template" << endl;
}
void F(bool v)
{
    cout << "bool " << endl;
}


эффект тот же, но пишется как обычная функция.
PM   Вверх
Ivanovich
Дата 15.4.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 31.3.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @ 15.4.2009,  10:50)

Тут больше подходит термин - перегрузка.

перегрузка шаблона функции != специализация шаблона функции
PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Ivanovich
Знаю, мой следующий пост посмотри.

Цитата

эффект тот же

PM   Вверх
Ivanovich
Дата 15.4.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 31.3.2009

Репутация: нет
Всего: нет



только надо помнить, что специализации шаблонов функций не перегружают функции и обычная функция void F(bool v) будет вызываться вместо специализации шаблона template<> void F<bool>(bool v)
PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Ivanovich
ну потому я и предложил только перегружать. Просто выглядет проще и результат в данном случае будет тот же.
PM   Вверх
Alek86
Дата 15.4.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(mes @  15.4.2009,  10:19 Найти цитируемый пост)
a зачем такое понадобилось ? если не секрет.

немного не в тему, но иногда это очень нужно
у примеру есть функция, что принимает 2 параметра

Код
template <typename T>
void func( std::auto_ptr<int> p, const T& a ) { /*...*/ }


а вызов у нее такой:

Код
int main () {
 MyClass2 m;
 func<MyClass1>(new int, m)
}


при том, что есть неявное преобразование из MyClass2 в MyClass1.
Но если это преобразование выкинет исключение, то велика вероятность утечки памяти.
Потому чтобы еще при проектировании функции func исключить такой шанс, сабж и нужен

если функция шаблонная, то в C++ нормальной возможности избавиться от такого варианта нет, потому в бусте делают примерно так
Код
template <typename T>
void func( std::auto_ptr<int> p, T& a ) { /*...*/ }


некрасиво, но лучше, чем оставлять дырки в либе

Это сообщение отредактировал(а) Alek86 - 15.4.2009, 11:25


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 15.4.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Alek86

Сатер описывает подобную ситуацию с std::auto_ptr и по моему лучшее решение этого вопроса не вызывать функцию принимающую std::auto_ptr подобным образом
Код

func<MyClass1>(new int, m)

а написать
Код

std::auto_ptr<int> ptr( new int );
func<MyClass1>(ptr, m);


Добавлено @ 11:34
правда область видимости тут будет побольше для std::auto_ptr, но если это актуально
Код

{
   std::auto_ptr<int> ptr( new int );
   func<MyClass1>(ptr, m);
}

даже если избежать утечки памяти так как вы написали, это все равно останется узким местом в программе. Завтра если добавить новый параметр и забыть про это утечка может снова произойти. 

Это сообщение отредактировал(а) azesmcar - 15.4.2009, 11:36
PM   Вверх
Alek86
Дата 15.4.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



azesmcar, ты пишешь либу, в которой есть эта функция

как гарантируешь, что юзер не вызовет ее "неправильно"?
или если вызовет, то сам дурак? smile
тогда уж зачем эта инкапсуляция, айда делать все методы открытыми, а если юзер неуследит и чето не так вызовет, то сам дурак smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.