Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Vlad0922
29 / 23 / 4
Регистрация: 20.11.2013
Сообщений: 65
#1

Сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей - C++

26.07.2014, 12:09. Просмотров 255. Ответов 3
Метки нет (Все метки)

Здравствуйте!

Имеется некий предикат, например:
C++
1
2
3
bool isInteger (double value){
    return static_cast<int>(value)==value;
}
С помощью него хочу посчитать кол-во элементов, удовлетворяющих предикату:
C++
1
2
3
4
5
6
7
8
9
10
11
template<typename T>
unsigned count(const T &collection, bool (*func)(double)){
    int counter=0;
 
 
for(typename T::const_iterator it = collection.begin(); it != collection.end();it++)
    if (func(*it))
        counter++;
 
    return counter;
}
При частичной специализации шаблона предиката (в данном случае типом double), все работает отлично.

C++
1
2
3
4
5
6
 std::vector<double> vec;
    
 for(int i=0;i<10;++i)
 vec.push_back(static_cast<double>(i)/2);
    
std::cout << count(vec,isInteger);
Но. Заранее мне неизвестно какой тип будет храниться в коллекции и хочу сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей.

Подскажите, как это сделать?
Заранее спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 12:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей (C++):

Исправить код парсера так, чтобы он работал только с буквами английского алфавита - C++
Есть программа, определяющая, расположены ли буквы во введенной строке в порядке, обратном алфавитному. Рабочая, опирается на...

Какого типа std::endl ? Как сделать так, чтобы функция могла принимать endl в качестве аргумента? - C++
Что надо указать в прототипе функции, чтобы можно передавать std::endl в качестве аргумента? Уже 3 часа голову ломаю! :wall: Помогите,...

Массив: Образовать новую последовательность чисел так, чтобы она тоже была неубывающей - C++
Помогиет реализовать программу на С++ или дайте советы по ее построению Даны две последовательности a1 ≤ a2 ≤ ... ≤ an и b1 ≤...

Как сделать так, чтобы батник работал с несколькими файлами? - CMD/BAT
Проблема в бат-файле. Как сделать так, чтобы батник работал на несколько файлов? Вот код: pushd c:\RKC\OUT\ C:\RKC\debase\xml fo %1...

Как сделать так, чтобы Service работал после закрытия программы - Программирование Android
Здравствуйте! Никак не могу разобраться, как сделать так, чтобы Service работал после закрытия программы. Вот что я написал в...

Как сделать так чтобы форумна движке phpBB работал с двумя БД? - phpBB
Здравствуйте, у меня такая ситуация... Мне в наследство от предыдущих программистов достался проект на которром был реализовал форум на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
26.07.2014, 12:18 #2
Vlad0922, Как в STL же.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename Collection, typename Pred>
unsigned count(const Collection& c, const Pred& pred)
{
    unsigned counter(0);
    for (typename Collection::const_iterator pos = c.begin(); pos != c.end(); ++pos)
    {
        if (pred(*pos))
        {
             ++counter;
        }
    }
    return counter;
}
 
// code
int counter = count(vec, &isInteger<double>);
А лучше использовать алгоритм std::count_if
1
Vlad0922
29 / 23 / 4
Регистрация: 20.11.2013
Сообщений: 65
26.07.2014, 12:31  [ТС] #3
Благодарю.
Совсем забыл, что при передаче тоже нужно функцию специализировать.

Насчет стандартных stl-алгоритмов:
да, в реальных проектах их лучше использовать, но предпочитаю изначально сам реализовать для понимания принципов работы.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
26.07.2014, 12:41 #4
Цитата Сообщение от Vlad0922 Посмотреть сообщение
Совсем забыл, что при передаче тоже нужно функцию специализировать.
Ну, на самом деле не обязательно. Можно по идее шаблонные шаблоны использовать.

Т.е. что-то типа:

C++
1
2
3
4
template<typename T, template <typename> class P>
unsigned count( const T& collection, P<typename T::value_type> func ) {
   ...
}
И соответственно вызывать все это дело так:
count(vec, isInteger )
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2014, 12:41
Привет! Вот еще темы с ответами:

Как сделать так, чтобы каждый поток работал с отдельным элементом массива - C#
н-ое количество потоков (в данном случае 3) выполняют операцию с массивом. Как сделать так, чтобы каждый поток работал с отдельным...

Как сделать так, чтобы при развертывании формы на весь экран картинка в форме тоже развертывалась автоматически? - Delphi
Как сделать так, чтобы при развертывании формы на весь экран картинка в форме тоже развертывалась автоматически? Так и скроллбар, кот. на...

Как сделать так, чтобы при изменении размеров формы компоненты на форме тоже изменяли свои размеры? - Delphi
Если форма развернута на весь экран, то все компоненты выглядят как нужно (см.скрин 1), а если окно формы уменьшить, то компоненты остаются...

Организовать таблицы, чтобы в зависимости от значений Типа (Глубины) /Высоты/Ширины получать цену - MySQL
Здравствуйте. Такая ситуация: имеется товар с параметрами Тип(Глубина)/Высота/Ширина = Цена. Как организовать таблицы так, чтобы в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.07.2014, 12:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru