使用std :: equal_to等测试特定的struct数据成员

时间:2012-02-29 08:01:11

标签: c++ c++11 std

#include <algorithm>
#include <functional>
#include <vector>

struct blah {
    int member;
};

int main (int argc, const char* argv[])
{
    blah a = { 1 };
    auto are_same = std::bind(
            std::equal_to<blah>(),
            a,
            std::mem_fn(&blah::member)   // Obviously not a function, but I tried.
        );

    std::vector<blah> blahs = { {0}, {1}, {2} };
    return static_cast<int>(std::any_of(blahs.begin(), blahs.end(), are_same));
}

该程序无法编译(GCC 4.4):

error: no match for call to ‘(std::equal_to<blah>) (blah&, std::_Mem_fn<int blah::*>&)’

除了自己编写循环外,基于数据成员检查等效性的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

如果您已经在使用C ++ 11,为什么不使用lambda?

int main (int argc, const char* argv[])
{
    blah a = { 1 };
    auto are_same = [=](blah const& b) -> bool {
        return a.member == b.member;
    };

    std::vector<blah> blahs = { {0}, {1}, {2} };
    return static_cast<int>(std::any_of(blahs.begin(), blahs.end(), are_same));
}

如果你不能使用lambdas,你可以使用bind来做函数组合:

using namespace std::placeholders;
auto are_same = std::bind(
  std::equal_to<int>(),
  std::bind(&blah::member, _1),
  std::bind(&blah::member, a)
);

答案 1 :(得分:2)

  

除了自己对循环进行编码之外,根据数据成员检查等效性的正确方法是什么?

检查等效性的正常方法是实现operator==。在你的情况下,我猜它会是这样的:

bool operator==( const blah & lho, const blah & rho )
{
  return ( lho.member == rho.member );
}