【问题标题】:std::all_of not accepting class member function as function with 1 argumentstd::all_of 不接受类成员函数作为具有 1 个参数的函数
【发布时间】:2013-01-22 14:46:02
【问题描述】:

我不知道我在这个std::all_of 电话中做错了什么。

我有一个班级统计:

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

Statistics 类的每个实例都对应一个特定的对象。

在另一个文件的另一个函数中,我只想在 all Statistics 实例中初始化数据时显示统计信息。我想通过以下方式使用std::all_of函数:

if( std::all_of(m_stats.begin(), m_stats.end(), &Statistics::isDataSet) ) {
...
}

在哪里std::vector&lt;Statistics*&gt; m_stats.

编译器报告错误,因为“谓词项不计算为采用 1 个参数的函数”。据我所知,每个类成员都将这个指针作为第一个参数传递,所以Statistics::isDataSet()实际上应该是一个有1个参数的函数。但是std::all_of 看错了。

我认为 Statistics::isDataSet() 应该被接受为 std::all_of() 中具有 1 个参数的函数是不是错了?

【问题讨论】:

    标签: c++ c++11 std member


    【解决方案1】:

    使用

    std::bind(&Statistics::isDataSet, std::placeholders::_1)
    

    [](const Statistics& s) { return s.isDataSet(); }
    

    而不是&amp;Statistics::isDataSet 调用all_of。后者期望 callable 类型(作为谓词)并将Statistics 的实例传递给它。指定没有实例的成员函数显然不足以进行调用

    【讨论】:

    • +1,后者对于非绑定人群来说更直观,但两者都是可行的。
    • 谢谢! [](const Statistics* s) { return s-&gt;isDataSet(); } 也成功了!为什么[x]() {return x-&gt;isDtaSet();} 不起作用?
    • @PavloDyban 最后一个 lambda 实际上是一个 nulary 可调用对象(函数),但应该是一元谓词
    • @PavloDyban:顺便说一句,想想看,你会在这里写什么而不是“x”:[x]() { return x.isDataSet(); } ??在呼叫站点,您还没有任何 Statictics 实例 :)
    • 另一个选项是std::mem_fun(&amp;Statistics::isDataSet)。它不太灵活,并且在 C++11 中已被弃用,但对于它确实适用的情况来说更加简洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2016-04-02
    • 2014-03-16
    • 2013-03-26
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多