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,但如果它有效,这就更清洁了。
由于
答案 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;
}