基于变量输入的泛型类方法计算
Generic class method computation based on variable input
我大致得到了以下设置:
#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;
}
所以两个类Element
和Bloc
,它们保存了一些我想Measurements
执行的数据。例如,我想测量Element
std::vector<float>
型handling_times
的getMean()
。另一种情况是根据存储在每个Bloc
中的努力来衡量std::vector<Bloc<float>*> blocs
的平均值。如您所见,Measurement
的输入类型各不相同,但平均值计算背后的功能始终保持不变。我希望此功能只实现一次(平均值只是我能想到的最简单的例子)并将其用于不同的类型。此外,我无法弄清楚如何根据哪个实体传递Measurement
对象(例如Element
costs
或Bloc
effort
)应计算度量。与HANDLING_TIMES
和COSTS
Element
进行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:此示例仅计算总和,只需除以元素数即可获得平均值。
相关文章:
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 如何在 C++ 中声明泛型类
- C++泛型包装类,它为某些函数添加了额外的处理
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- C++存储泛型 T 类型类的向量
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- 从具有泛型返回类型的 crtp 基类调用派生类中的函数
- 具有 std::function 的公共基类的泛型对象
- 重载泛型类型的模板类时检查运算符=时的自赋值
- 在C++中,如何根据类中的参数返回不同的泛型类型
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- C++-14 使用enable_if_t在整型上选择类模板化的成员函数
- 泛型列表节点类中出错
- 为返回指向函数的指针的泛型函数指定类
- 使整型向量从具有整型类型的类的向量中接收值
- 在泛型和子类代码中需要相互引用的c++类
- c++中的泛型编程和类中的类型定义
- 如何使用泛型模板重载类的运算符