Dru*_*sky 1 c++ class vector operator-overloading
我正在从用于解决 ODE 的类层次结构转移到用于解决 ODE 系统的类。
在我使用单个函数的实现中,我使用以下内容来存储我的函数:
std::function<const Type(const Type, const Type)> numericalFunction
Run Code Online (Sandbox Code Playgroud)
我有一个包装器来评估数值函数:
Type f (Type t, Type u) const noexcept { return numericalFunction(t,u); }
Run Code Online (Sandbox Code Playgroud)
现在我要解决方程组,所以我需要存储多个函数。我尝试使用 a 存储函数集,std::vector如下所示:
std::vector<std::function<const Type(const Type,const Type)>> numericalFunction;
Run Code Online (Sandbox Code Playgroud)
我希望能够使用与上述问题相同的语法。那是,
f[0](12,32); 应该执行 numericalFunction.at(0)(12,32);
dfdt[0](t, u); 应该执行 (numericalFunction.at(0)(t, u+eps) - numericalFunction.at(0)(t, u))/eps;
我如何编写代码以允许这样的语法?
编辑我有一个问题..现在我需要更改功能
std::vector<std::function<const Type(const Type,const Type)>> numericalFunction;
Run Code Online (Sandbox Code Playgroud)
变成:
std::vector<std::function<const Type(const Type,const std::vector<Type>)>> numericalFunction;
Run Code Online (Sandbox Code Playgroud)
并且派生类不起作用
您可以将一组函数存储为:
std::vector<std::function<const Type(const Type t, const Type u)>> numericalFunList;
Run Code Online (Sandbox Code Playgroud)
您获得正确函数的等效函数将是:
const Type f(size_t idx, const Type t, const Type u) { return numericalFunList.at(idx)(t,u); }
Run Code Online (Sandbox Code Playgroud)
的std::vector内部是一个动态数组。这为每个函数提供了一个从0until开始的索引numericalFunList.size() - 1。您可以通过向量中的索引来识别每个函数。
编辑1:
OP 更喜欢使用以下语法: f[0](arg1, arg2);
以上很容易实现: numericalFunList[0](1.2, 5.9);
如果f需要清楚(对于数学家;程序员会讨厌它),
auto& f = numericalFunList;
f[0](10.9, 2.4);
Run Code Online (Sandbox Code Playgroud)
作为提示,请考虑不要f在全局范围内用作变量名。如果f是首选,请使用auto& f = numericalFunList为您做。
编辑2:
对于新的语法要求,您需要使用两个类,每个类都有一个运算符重载:一个用于存储[]运算符重载的导数集,另一个用于计算()运算符重载的导数。
typedef long double Type;
constexpr Type eps = 1E-12;
using analysisFunction = std::function<const Type(const Type, const Type)>;
class derivatives {
private:
class derivative;
public:
derivatives(std::vector<analysisFunction>& p_fList) { fList = &p_fList; };
derivative operator[](int index) {
return derivative((*fList).at(index));
}
private:
class derivative {
public:
derivative(analysisFunction& p_f) { f = &p_f; }
Type operator()(Type t, Type u) {
return (((*f)(t, u + eps)) - ((*f)(t,u)))/eps;
}
private:
analysisFunction *f;
};
std::vector<analysisFunction> *fList; //dangling pointer
};
Run Code Online (Sandbox Code Playgroud)
示例用法
int main ()
{
std::vector <analysisFunction> numericalFunctions;
auto& f = numericalFunctions;
f.push_back([](Type t, Type u)->Type { return u*u; });
std::cout << std::setprecision(16);
std::cout << f[0](5.0, 10.0) << '\n';
derivatives dfdt(f);
std::cout << dfdt[0](5.0, 10.0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:fList是一个悬空指针。有几种方法可以处理它。如果您可以保证引用的对象不会被释放,或者您可以在对象中维护一个副本(这会消耗内存和 CPU),则可以保持原样。
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |