std :: all_of不接受类成员函数作为带有1个参数的函数

Pav*_*ban 1 c++ std member c++11

我无法想象这次std::all_of电话我做错了什么.

我有一个班级统计:

class Statistics {
public:
bool isDataSet() const { return m_data.size() > 0; }
private:
std::vector<double> m_data;
};
Run Code Online (Sandbox Code Playgroud)

Statistics类的每个实例对应于某个对象.

在另一个不同文件中的函数中,我想仅在数据已在所有 Statistics实例中初始化时才显示统计信息.我想以std::all_of下列方式使用函数:

if( std::all_of(m_stats.begin(), m_stats.end(), &Statistics::isDataSet) ) {
...
}
Run Code Online (Sandbox Code Playgroud)

哪里 std::vector<Statistics*> m_stats.

编译器报告错误,因为'谓词术语不评估为采用1个参数的函数'.据我所知,每个类成员都将此指针作为第一个参数传递,因此Statistics::isDataSet()实际上应该是一个带有1个参数的函数.但是std::all_of看错了.

我的假设是错误的,Statistics::isDataSet()应该被接受为带有1个参数的函数std::all_of()吗?

zau*_*ufi 8

使用

std::bind(&Statistics::isDataSet, std::placeholders::_1)
Run Code Online (Sandbox Code Playgroud)

要么

[](const Statistics& s) { return s.isDataSet(); }
Run Code Online (Sandbox Code Playgroud)

而不是 &Statistics::isDataSet打电话给all_of.后者期望一个可调用的类型(作为谓词)并将一个实例传递Statistics给它.指定成员函数w/o实例显然不足以进行调用

  • +1,后者对非束缚人群更直观,但两者都是可行的. (2认同)
  • 另一种选择是`std :: mem_fun(&Statistics :: isDataSet)`.它的灵活性较低,在C++ 11中已被弃用,但它适用的情况更为简洁. (2认同)