#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::*>&)’
除了自己编写循环外,基于数据成员检查等效性的正确方法是什么?
答案 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 );
}