c++ - 在 std 算法中否定 boost is_directory

标签 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,但如果它有效,它会更干净。

谢谢

最佳答案

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); });

关于c++ - 在 std 算法中否定 boost is_directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471206/

相关文章:

c++ - 如何创建简单的 Boost.Build make 文件,其中包含指向我在 Windows 和 Linux 上使用的库的链接?

c++ - 无法在终端中编译 C++ 项目

c++ - operator void* () 是什么意思?

c++ - 将 std::array 作为模板可变参数函数的参数传递

javascript - Highcharts:分散中的数据点过多 - 仅渲染圆圈

C++ 有效地从用户定义结构的 vector 中提取子集

c++ - 用 C++ 编写 Mac OS X 应用程序的完整解决方案

c++ - 文件作用域和静态 float

c++ - 在模板构建器模式中排除重复的构造函数调用

c++ - std::upper_bound 和 std::lower_bound 的不同比较签名