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

Testing a specific struct data member with std::equal_to, etc

本文关键字:结构 数据成员 测试 std equal to 使用      更新时间:2023-10-16
#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::*>&)’

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

如果您已经在使用 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)
);

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

检查等效性的正常方法是实现operator==。在您的情况下,我想它看起来像这样:

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