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

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

Восстановить пароль Регистрация
 
Vlad0922
28 / 22 / 4
Регистрация: 20.11.2013
Сообщений: 65
26.07.2014, 12:09     Сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей #1
Здравствуйте!

Имеется некий предикат, например:
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);
Но. Заранее мне неизвестно какой тип будет храниться в коллекции и хочу сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей.

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

C++ Как переопределить функцию так, чтобы она не только могла принимать разные параметры, но и возвращать тоже разные?
Массив: Образовать новую последовательность чисел так, чтобы она тоже была неубывающей C++
C++ Переделать код так, чтобы использовались диапазоны значений с помощью указателей
Как сделать, чтобы switch работал как цикл? C++
C++ Как сделать так,чтобы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Vlad0922
28 / 22 / 4
Регистрация: 20.11.2013
Сообщений: 65
26.07.2014, 12:31  [ТС]     Сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей #3
Благодарю.
Совсем забыл, что при передаче тоже нужно функцию специализировать.

Насчет стандартных stl-алгоритмов:
да, в реальных проектах их лучше использовать, но предпочитаю изначально сам реализовать для понимания принципов работы.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
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 )
Yandex
Объявления
26.07.2014, 12:41     Сделать так, чтобы предикат работал тоже шаблонно, в зависимости от типа значений, хранимых ей
Ответ Создать тему
Опции темы

Текущее время: 03:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru