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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пример простой шаблонной функции, bool InDiapason(val, side1, side2) 
:(
    Опции темы
ZVano
Дата 11.3.2011, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может кому пригодится, вот пример простой шаблонной функции InDiapason(val, side1, side2), которая проверяет находится ли значение val между side1 и side2.
Так выглядело без шаблона
Код

bool InDiapason_double(double val, double side1, double side2) {
    double sideMin = min<double>(side1, side2);
    double sideMax = max<double>(side1, side2);
    return val >= sideMin && val <= sideMax;
}

bool InDiapason_int(int val, int side1, int side2) {
    int sideMin = min<int>(side1, side2);
    int sideMax = max<int>(side1, side2);
    return val >= sideMin && val <= sideMax;
}

Это не есть хорошо - плодить функции, делающие одно и тоже, но различающиеся типом данных на входе.

Поэтому пишем шаблон.
Код

template<class T>
bool InDiapason(T val, T side1, T side2) {
    T sideMin = min<T>(side1, side2);
    T sideMax = max<T>(side1, side2);
    return val >= sideMin && val <= sideMax;
}

//а еще лучше, так:
template<class T>
bool InDiapason(T val, T side1, T side2) {
    return val >= min<T>(side1, side2) && val <= max<T>(side1, side2);
}



Используем так:
Код

    int val = 1, side1 = 3, side2 = 5;

    if (InDiapason(val, side1, side2)) {
        ShowMessage("В диапазоне");
    }
    else {
        ShowMessage("Не в диапазоне");
    }


Это сообщение отредактировал(а) ZVano - 11.3.2011, 17:39


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
mes
Дата 11.3.2011, 17:31 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ZVano @  11.3.2011,  16:05 Найти цитируемый пост)
   T sideMin = min<T>(side1, side2);
    T sideMax = max<T>(side1, side2);
    return val >= sideMin && val <= sideMax;


имхо локальные переменные только загромождают код в данном случае..
Код

return val >= min<T>(side1, side2)
    && val <= max<T>(side1, side2);


а вообще, мне кажется вместо функции, лучше создать класс диапазон с нужными методами..

Это сообщение отредактировал(а) mes - 11.3.2011, 17:32


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



К сожалению, предложенный способ использования не очень удобен. А удобный работать не будет:
Код
double x = 10;
if (InDiapason(x, 1, 20))
   std::cout << "OK" << std::endl;

PM   Вверх
ZVano
Дата 11.3.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  11.3.2011,  17:31 Найти цитируемый пост)
имхо локальные переменные только загромождают код в данном случае..

Спасибо, исправил в шапке.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
mes
Дата 11.3.2011, 18:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(bsa @  11.3.2011,  16:35 Найти цитируемый пост)
К сожалению, предложенный способ использования не очень удобен. А удобный работать не будет:

легким движением руки брюки превращаются ©

Код

template<typename A, typename T>
bool InDiapason(A const& val, T const& a1, T const& a2) {
    return val >= std::min(a1, a2) 
        && val <= std::max(a1, a2);
}

int main() {
   double x = 10;
   if (InDiapason(x, 1, 20))
      std::cout << "OK" << std::endl;
}


http://liveworkspace.org/code/8e55dd1474e7...d8a9a75a287290d
smile 

Это сообщение отредактировал(а) mes - 11.3.2011, 18:57


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


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


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

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



Цитата(mes @  11.3.2011,  16:31 Найти цитируемый пост)
класс диапазон

вот пример :
http://liveworkspace.org/code/ac80857007be...f69efc985a2ecd6

и альтернативный вариант, на мой взгляд более приемлемый, где contain не является членом класса range :
http://liveworkspace.org/code/8525efa23c88...0a090e682a98079

ну и в продолжение, с добавлением перегрузки функции для удобства :
http://liveworkspace.org/code/add387a49fc9...1ba3f7eba7186ae

Это сообщение отредактировал(а) mes - 28.4.2011, 13:19


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


Опытный
**


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

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



Цитата(mes @  11.3.2011,  20:15 Найти цитируемый пост)
вот пример :http://liveworkspace.org/code/ac80857007be...f69efc985a2ecd6

Спасибо. Пока непонятно, но работает. Буду грызть гранит дальше.


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
mes
Дата 11.3.2011, 20:49 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ZVano @  11.3.2011,  19:31 Найти цитируемый пост)
Пока непонятно

auto непонятна ? 
можно заменить 
Цитата

Код

 auto _range =  make_range(1, 20);


на
Код

 range<int> _range(1, 20);

или вместо 
Цитата

Код

   auto _range =  make_range(1, 20);   
   if (_range.contain(4.5))


сразу писать
Код

 if (make_range(1, 20).contain(4.5))


Это сообщение отредактировал(а) mes - 11.3.2011, 20:50


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 28.4.2011, 15:46 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(mes @  11.3.2011,  18:57 Найти цитируемый пост)
    
return val >= std::min(a1, a2)         
    && val <= std::max(a1, a2);

а может лучше заставить пользователя определить только одну операцию вместо двух ? например только >=
Код

return val >= std::min(a1, a2)         
     && std::max(a1, a2) >= val;



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.4.2011, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(borisbn @  28.4.2011,  14:46 Найти цитируемый пост)
а может лучше заставить пользователя определить только одну операцию вместо двух ? например только >=

тогда уж следовать общепринятой тенденции и оставить одну операцию меньше smile



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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(mes @  28.4.2011,  15:52 Найти цитируемый пост)
тогда уж следовать общепринятой тенденции и оставить одну операцию меньше 

Не имею желания, а также сообщаю об отсутствии тенденции делать вещь в высшей степени глупую, а именно - возражать. Другими словами имею желание сделать сообщение, что согласен на все 0x64  smile 

Это сообщение отредактировал(а) borisbn - 28.4.2011, 16:37


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 28.4.2011, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



как пример из шапки превратить в inline?
PM MAIL   Вверх
mes
Дата 28.4.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(borisbn @  28.4.2011,  15:36 Найти цитируемый пост)
Не имею желания, а также сообщаю об отсутствии тенденции делать вещь в высшей степени глупую, а именно - возражать. Другими словами имею желание сделать сообщение, что согласен на все 0x64

 smile  smile  smile 

пример для оператора < 
Код

template<typename T, typename A>
bool contain (A const& a, range<T> const& range)
{
   return !(a < range.begin || range.end < a) ;
}




--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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