如何在一元谓词中使用类成员变量
How to use a class member variable in a unary predicate?
假设我有以下代码:
#include <vector>
#include <algorithm>
#include <cmath>
bool pred(float const &val)
{
//return fabs(val) < epsilon;
}
class Foo
{
public:
Foo(float eps) : epsilon(eps) { }
int Bar(std::vector<float> vec)
{
return std::count_if(vec.begin(), vec.end(), pred);
}
private:
float epsilon;
}
我想将一元谓词pred()
作为类方法,以便它可以访问epsilon
成员变量。我见过使用operator()
的例子,但如果我做对了,操作符应该比较整个类实例。我只需要比较Bar()
中给定的std::vector
的元素。是否可以创建一元谓词作为类成员?如果不能,还有其他方法吗?
如果你正在使用c++ 11,你应该是一个简单的方法是lambda
int Bar(std::vector<float> vec)
{
return std::count_if(vec.begin(), vec.end(),[this](const float &f)
{
return fabs(val) < epsilon;
});
}
c++ 98的解决方案:
class Pred{
private:
float eps;
public:
Pred(float eps) : eps(eps){
}
bool operator()(const float& val){
return val < eps;
}
};
并像这样使用:
int Bar(std::vector<float> vec)
{
Pred pred(epsilon);
return std::count_if(vec.begin(), vec.end(), pred);
}
请注意,此解决方案适用于任何需要额外数据的谓词;编写一个包含附加数据的类作为类成员,并重载()
操作符。您可以使用适当的数据初始化类的对象,然后将其用作谓词。
您的问题是pred()需要两个参数,而std::count_if想要一个只接受一个参数的函数。@Praetorian使用lambda的c++11解决方案是最佳的。但是如果没有这个权限,你应该可以使用std::bind1st,它可以为你完成operator()的解决方案,而不需要你显式地创建一个类来完成它。
#include <vector>
#include <algorithm>
#include <cmath>
#include <functional>
bool pred(float const &val, float epsilon)
{
return fabs(val) < epsilon;
}
class Foo
{
public:
Foo(float eps) : epsilon(eps) { }
int Bar(std::vector<float> vec)
{
return std::count_if(vec.begin(), vec.end(), std::bind1st(std::less<float>(), epsilon));
}
private:
float epsilon;
};
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组