基于变量输入的泛型类方法计算

Generic class method computation based on variable input

本文关键字:泛型 泛型类 类方法 计算 输入 于变量 变量      更新时间:2023-10-16

我大致得到了以下设置:

#include <iostream>
using namespace std;
template<typename T>
class Element{
T getX() const;
T getY() const;
private:
T x,y;
std::vector<float> handling_times;
float cost;
};
template<typename T, typename Tnext>
class Bloc {
T getX() const;
T getY() const;
private:
T x,y;
Tnext num_blocs;
float effort;
float damage_done;
};
template<typename T>
class Measurements {
void calcMeasurements(const std::vector<T*> &data);
float getMean() const;
private:
float mean;
};

int main() {
std::vector<Element<int>*> elements;
// fill with elements
std::vector<Bloc<float,2>*> blocs;
// fill with blocs
// calculate mean of blocs effort
Measurements<Bloc<float,1>> bloc_mean_effort_measurement;
bloc_mean_effort_measurement.calcMeasurements(blocs);
return 0;
}

所以两个类ElementBloc,它们保存了一些我想Measurements执行的数据。例如,我想测量Elementstd::vector<float>handling_timesgetMean()。另一种情况是根据存储在每个Bloc中的努力来衡量std::vector<Bloc<float>*> blocs的平均值。如您所见,Measurement的输入类型各不相同,但平均值计算背后的功能始终保持不变。我希望此功能只实现一次(平均值只是我能想到的最简单的例子)并将其用于不同的类型。此外,我无法弄清楚如何根据哪个实体传递Measurement对象(例如ElementcostsBloceffort)应计算度量。与HANDLING_TIMESCOSTSElement进行enum PossibleMeasurements是否有意义.所以说对于每个私有变量,我希望能够计算度量。

如果我理解问题相关,你或多或少有这个:

struct A {
std::vector<int> a;
};
struct B {
int value;
B(int x) : value(x) {}
};    
typedef std::vector<B> Bvect;

现在,您要使用相同的泛型函数计算值的平均值,无论它们是在A中还是在Bvect中。此泛型函数已存在,称为std::accumulate。对于包含向量的对象,您将执行

A foo;
foo.a.push_back(123);
std::cout << std::accumulate(foo.a.begin(),foo.a.end(),0.0) << "n";

您必须传递两个迭代器,指示第一个迭代器,一个迭代器经过要累积的最后一个元素,以及一个初始值。

对于看起来非常相似的Bvect,我们只需要提供一种添加元素的自定义方法:

Bvect b;
b.push_back(B(123));
std::cout << std::accumulate(b.begin(),
b.end(),
B(0),
[](B b1,B b2){
return B(b1.value + b2.value);
}).value << "n";

我使用 lambda 访问要添加的值,并构造一个保存两个值之和的B

PS:此示例仅计算总和,只需除以元素数即可获得平均值。