Отрицательный импульс is_directory в алгоритме std - PullRequest
2 голосов
/ 19 сентября 2011
boost::filesystem::recursive_directory_iterator end, begin(directory);

auto num_of_files=std::count_if(begin, end, 
        std::not1(boost::filesystem::is_directory)));

Я пытаюсь свести на нет функцию is_directory на указанном выше итераторе каталога, но бью кирпичную стену.Я попытался указать шаблон для not1 как bool(*)(const boost::filesystem::path&) и пробовал статическое приведение функции к обоим безуспешно.

Я знаю, что могу прибегнуть к lamdba, но это чище, если он работает.1007 * Спасибо

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

std::not1 нужен объект функции в качестве аргумента. Этот функциональный объект может быть получен с помощью std::ptr_fun, поэтому это должно работать:

auto num_of_files=std::count_if(begin, end, 
        std::not1(std::ptr_fun((bool(*)(const boost::filesystem::path&))boost::filesystem::is_directory)));

(количество скобок, вероятно, неверно). Кстати, вам нужен приведение, потому что is_directory - перегруженная функция.

Тем не менее, поскольку вы помечаете свой вопрос c ++ 11, вы можете использовать лямбда-выражения:

auto num_of_files=std::count_if(begin, end, [](const boost::filesystem::path& p) { return !boost::filesystem::is_directory(p); });
0 голосов
/ 19 сентября 2011

Вам нужен ptr_fun,

, эта довольно сложная иллюстрация должна напечатать 1 три раза: (см. Также http://ideone.com/C5HTR)

#include <functional>
#include <string>
#include <algorithm>
#include <iostream>

bool pred(const std::string& s)
{
    return s.size() % 2;
}

int main()
{
    std::string data[] = { "hello", "world!" };

    std::cout << std::count_if(data, data+2, 
            pred) << std::endl;

    std::cout << std::count_if(data, data+2, 
            std::ptr_fun(pred) ) << std::endl;

    std::cout << std::count_if(data, data+2, 
            std::not1(std::ptr_fun(pred))) << std::endl;

    return 0;
}
0 голосов
/ 19 сентября 2011

not1 принимает экземпляр класса функтора, который должен быть Adaptable Predicate (т.е. с typedefs для возвращаемого значения и т. Д.), В то время как вы пытаетесь передать его указателем функции.Поэтому вам нужно обернуть его в функтор, и ptr_fun может помочь.Возможно, это сработает (предположим, с использованием пространства имен std; с использованием увеличения пространства имен;):

auto num_of_files=count_if(begin, end, not1(ptr_fun(filesystem::is_directory)));
...