gpt4 book ai didi

c++ - 根据给定的对象类型改变类的行为

转载 作者:太空狗 更新时间:2023-10-29 20:05:22 26 4
gpt4 key购买 nike

我想设计一个通用的 C++ 类,它定义一个 operator() 函数,该函数返回某个点处的数学函数的值。但是,我希望该类能够使用已经定义了 operator() 的对象或使用该类将插入以提供值的值表来实例化。我想到了以下方法:

class MathFunction
{
MathFunction(Functor& function);
MathFunction(Mat<double> interpolationValues);

double operator()(double radius, double angle);
};

其中构造函数可以设置成员变量,double operator() 可以使用 switch 语句来确定如何输出我想要的 double。不过,这似乎非常不优雅。

此类的模板化版本可能有用,但由于这两种方法不共享任何代码,这样做是否明智?模板化版本究竟是如何设计的?

不确定我是否清楚。如果需要任何说明,请发表评论。

编辑:虽然我选择 Useless 的答案是因为它的完整性,但我想强调 dasblikenlight 贡献的速度和清晰度。谢谢。

最佳答案

这是使用 strategy pattern 的主要案例:根据传递给构造函数的参数,MathFunction 应该实例化依赖于 Functor 的策略对象,或者实例化依赖于插值列表的策略对象。 operator() 的调用应该将调用转发给策略,并通过一个公共(public)虚函数的实现得到结果:

class MathFunction {
struct Strategy {
virtual double Calculate(double radius, double angle)=0;
virtual ~Strategy(){}
};
class FunctorStrategy : public Strategy {
Functor& _function;
public:
FunctorStrategy(Functor& function) : _function(function) {}
virtual double Calculate(double radius, double angle) {
return _function(radius, angle);
}
}
class InterpolationStrategy : public Strategy {
Mat<double> _interpolationValues;
public:
InterpolationStrategy (Mat<double> interpolationValues)
: _interpolationValues(interpolationValues) {}
virtual double Calculate(double radius, double angle) {
return ...; // Use _interpolationValues to do calculation
}
};
unique_ptr<Strategy> _strategy;
public:
MathFunction(Functor& function)
: _strategy(new FunctorStrategy(function)) {}
MathFunction(Mat<double> interpolationValues)
: _strategy(new InterpolationStrategy(interpolationValues)) {}
// And now for the complicated part:
double operator()(double radius, double angle) {
return _strategy->Calculate(radius, angle); // TA-DA!!!
}
};

关于c++ - 根据给定的对象类型改变类的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com