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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонная функция find 
:(
    Опции темы
neocpp
Дата 10.2.2013, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Необходимо создать что-то вроде аналога алгоритма find из STL. Вызов примерно такой:

Код

find(vec.begin(), vec.end(), key)


Но главное вот что. Как реализовать функцию, чтобы вызов был возможен, только если третий параметр в точности соответствует типу элементов в контейнере? То есть, если vec - вектор значений int, а key - переменная типа double, то нужно, чтобы происходила ошибка компиляции.

Первая попытка:
Код

template <class iter_type, class value_type>
iter_type find(iter_type begin, iter_type end, const value_type & key)
{
    while(begin != end && *begin != key)
    {
        ++begin;
    }
        
    return begin;
}

Тут value_type и iter_type вообще никак не связаны. Поэтому неявные преобразования выполняются, и ошибка может возникнуть только при *begin != key, если неявное преобразование между типами невозможно.

Попытка вторая, переписал заголовок таким образом:
Код

template <class iter_type>
iter_type find(iter_type begin, iter_type end, const typename std::iterator_traits<iter_type>::value_type & key)

в надежде на то, что тип параметра key теперь будет зависеть от типа итератора. Но от преобразований это все-равно не спасает. Как вариант, конечно, можно передать обычную ссылку вместо константной... но это по сути нехорошо.

Возможно ли еще какое-то решение этой проблемы?

Это сообщение отредактировал(а) neocpp - 10.2.2013, 11:15
PM MAIL   Вверх
volatile
Дата 10.2.2013, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(neocpp @  10.2.2013,  11:00 Найти цитируемый пост)
чтобы вызов был возможен, только если третий параметр в точности соответствует типу элементов в контейнере?

Можно, например так:
Цитата(neocpp @  10.2.2013,  11:00 Найти цитируемый пост)
template <class iter_type, class value_type>
iter_type find(iter_type begin, iter_type end, const value_type & key)
{
    static_assert (std::is_same <typename std::iterator_traits<iter_type>::value_type, 
                   value_type>::value, "Ahtung! blablabla... type mismatch");


    while(begin != end && *begin != key)
    {
        ++begin;
    }
        
    return begin;
}

если нет  С++11, то в бусте это есть.

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


Эксперт
****


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

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



Или так
Код

template <class iter_type, class value_type>
iter_type find(iter_type begin, iter_type end, const value_type & key,
    std::is_same <typename std::iterator_traits<iter_type>::value_type, value_type>::type * = nullptr)
{
…
}



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


Новичок



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

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



volatile,  спасибо, так получилось.

borisbnб,  а ваш код не понял, к сожалению, и отрабатывает он также как и мой. Какую роль должен играть третий параметр?
PM MAIL   Вверх
borisbn
Дата 11.2.2013, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(neocpp @  11.2.2013,  09:58 Найти цитируемый пост)
Какую роль должен играть третий параметр? 

это - SFINAE


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

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

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

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

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


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

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


 




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


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

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