在std算法中否定boost is_directory

时间:2011-09-19 12:50:44

标签: c++ boost c++11 negate

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,但如果它有效,这就更清洁了。

由于

3 个答案:

答案 0 :(得分:6)

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,你可以使用lambdas:

auto num_of_files=std::count_if(begin, end, [](const boost::filesystem::path& p) { return !boost::filesystem::is_directory(p); });

答案 1 :(得分:0)

not1接受一个functor类的实例,它应该是Adaptable Predicate(即返回值的typedef等),而你试图用函数指针来提供它。因此,您需要将其包装在仿函数中,ptr_fun可能有所帮助。 也许这会起作用(假设使用namespace std; using namespace boost;):

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

答案 2 :(得分:0)

你需要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;
}