使用成员变量作为谓词
Using member variable as predicate
>我正在尝试在对象向量中找到一个对象,该对象变量的值为真。是否可以在不定义 lamba 函数或函数对象的情况下完成,只需指定成员变量本身:
class A
{
public:
explicit A(bool v, int v2, float v3) : value(v), value2(v2), value3(v3)
{}
...
bool value;
int value2;
float value2;
...
}
int main()
{
std::vector<A> v;
v.push_back(A(false, 1, 1.0));
v.push_back(A(true, 2, 2.0));
v.push_back(A(false, 3, 3.0));
auto iter = std::find_if(v.begin(), v.end(), &A::value);
}
如上所述编译不起作用,因为它假定 A* 而不是 A。
并不是说使用 lambda 是问题,只是好奇。
您可以使用std::mem_fn
auto iter = std::find_if(v.begin(), v.end(), std::mem_fn(&A::value));
演示
请注意,范围库应直接允许:
auto iter = range::find_if(v, &A::value);
如果您不能使用 C++11 lambda,您可以使用 std::bind
auto iter = std::find_if(v.begin(), v.end(), std::bind(&A::value, std::placeholders::_1));
解决方案如下
- (可选)不要将构造函数
A(bool)
标记为显式以允许从bool
到A
的隐式转换(coliru 上的现场演示) - 重载
operator==()
,以便它仅使用value
来建立相等性。
您还可以提供operator==(bool v) { return value == v;}
(请参阅此演示)
当然,我建议您不要使用该解决方案,因为它很脏。只需使用 std::find_if
提供一个谓词即可完成工作。请注意,所述谓词必须具有operator()
因此您当然不能提供诸如bool
之类的值作为谓词std::find_if
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- std::condition_variable::wait()如何评估给定的谓词
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- 在条件变量中不使用谓词会导致速度变慢
- 条件变量的"wait"函数在提供谓词时导致意外行为
- 使用成员变量作为谓词
- 类中的静态变量和虚函数,用于实现sort()的谓词
- 如何在一元谓词中使用类成员变量
- 转换谓词,通过引用返回局部变量