如何正确设计从结构中获取不同字段的函子
How to properly design a functor that would fetch different fields from a struct
我有一个由struct
组成的std::vector
,其中包含几个字段,如下所示:
struct stats
{
double mean;
double median;
double rms;
};
std::vector<stats> data;
我想设计一个对vector
进行操作的函数,例如,构建一个直方图。我希望能够指定这个函数应该在struct
的哪个字段上运行。例如:
build_histogram(data, get_mean);
build_histogram(data, get_median);
build_histogram(data, get_rms);
我尝试在stats
类中实现一些getter,比如:
struct stats
{
double mean;
double median;
double rms;
struct get_mean { double operator() () { return mean; };
struct get_median { double operator() () { return median; };
struct get_rms { double operator() () { return rms; };
};
但它表示,这是对非静态成员mean
、median
和rms
的无效使用。我如何才能正确地实现它?
您试图传递一个类型,而不是一个对象。在容器上迭代时,函子应接受向量元素作为参数。有几种方法可以做到这一点,其中最类似于你试图做的是:
struct stats
{
double mean;
double median;
double rms;
struct get_mean { double operator() (const stats& s) { return s.mean; } };
struct get_median { double operator() (const stats& s) { return s.median; } };
struct get_rms { double operator() (const stats& s) { return s.rms; } };
};
build_histogram(data, stats::get_mean());
build_histogram(data, stats::get_median());
build_histogram(data, stats::get_rms());
但是,如果您支持Lambda(C++11中的新功能),那么使用它们会更简单。
struct stats
{
double mean;
double median;
double rms;
};
build_histogram(data, [](const stats& s) { return s.mean; });
// etc.
为了使其中任何一个工作,build_histogram
应该是一个函数模板,第二个参数是任何可调用对象(根据需要更改ReturnType
)。
template <typename F>
ReturnType build_histogram(const std::vector<stats>& data, F functor)
{
// here you can use functor() or pass it to STL algorithm (e.g. find_if)
}
定义函子的不同方法是(或多或少按照我的偏好顺序)
- lambda函数(C++11)
- 自由函数
- functor对象(这就是您所做的,但它不必嵌套在类型中)
- 静态成员函数
- 使用
std::bind
的成员函数(我不建议这样做)
为什么要重新发明元组?
enum {mean, median, rms};
typedef std::tuple<double,double,double> stats;
stats st{1,2,3};
cout << get<mean>(st);
相关文章:
- 获取具有字段名称的 SELECT 字段类型,并带有 MariaDB C++连接器
- python.clang AST 解析:获取字段声明的 c++ 模板参数
- 获取类中的字段数
- TOS字段从Linux的TCP插座上接收到的数据包获取
- 如何在消息文件中获取用户定义的字段
- 使用 C++ 从 WMI 获取 Windows USB 字幕字段
- 从结构向量中,获取一个向量,该向量收集每个结构的一个字段
- 函数从模板参数中获取字段值,而不是直接访问以允许对相同信息使用不同的名称
- 获取 id 字段作为 QSqlTableModel 中记录的整数
- Qt在主窗口字段中从主窗口获取ui参数
- 快速JSON库获取没有名称字段的值
- 如何在ODBC本机客户端中获取SQL Server DateTime字段
- 如何在 CORBA 中获取和设置类字段?(处理 CORBA 对象的序列)
- 从编辑字段(C++WINAPI)获取值
- 如何从Qt中的字符串中获取特定字段的值
- Lua:加载第二个字符串后无法获取字段;
- 如何使用分隔符获取所有第二个字段的总和
- 遍历所有字段并在 protobuf 消息中获取它们的值
- 如何正确设计从结构中获取不同字段的函子
- 获取 Apache Avro 的通用记录字段的名称?