2
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 ,但遇到了一堵砖墙。我尝试为not1as指定模板bool(*)(const boost::filesystem::path&)并尝试静态转换该函数,但均未成功。

我知道我可以求助于 lamdba,但如果它有效,这会更干净。

谢谢

4

3 回答 3

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,因此您可以使用 lambda:

auto num_of_files=std::count_if(begin, end, [](const boost::filesystem::path& p) { return !boost::filesystem::is_directory(p); });
于 2011-09-19T13:06:04.820 回答
0

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

auto num_of_files=count_if(begin, end, not1(ptr_fun(filesystem::is_directory)));
于 2011-09-19T13:07:19.720 回答
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;
}
于 2011-09-19T13:07:21.590 回答