30 / 24 / 5
Регистрация: 20.11.2013
Сообщений: 65
1

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

26.07.2014, 12:09. Показов 481. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2014, 12:09
Ответы с готовыми решениями:

Как сделать так, чтобы батник работал с несколькими файлами?
Проблема в бат-файле. Как сделать так, чтобы батник работал на несколько файлов? Вот код: pushd...

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

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

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

3
В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
30 / 24 / 5
Регистрация: 20.11.2013
Сообщений: 65
26.07.2014, 12:31  [ТС] 3
Благодарю.
Совсем забыл, что при передаче тоже нужно функцию специализировать.

Насчет стандартных stl-алгоритмов:
да, в реальных проектах их лучше использовать, но предпочитаю изначально сам реализовать для понимания принципов работы.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2014, 12:41
Помогаю со студенческими работами здесь

Как сделать так чтобы сайт работал при любом разрешении экрана?
как сделать так что бы сайт работал при любом разрешении экрана &lt;!DOCTYPE html&gt; &lt;html&gt; ...

Как сделать так, чтобы при максимизации формы объекты тоже растягивались?
Как сделать так, чтобы при максимизации формы объекты тоже растягивались? Например, у меня экран...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru