C++ 在C+中实现一个数学向量+;重用标准库的容器

C++ 在C+中实现一个数学向量+;重用标准库的容器,c++,ode,vector-space,C++,Ode,Vector Space,这个问题是由以下一阶常微分方程(ODE)积分龙格-库塔公式的实现引起的 但上述龙格-库塔码也可用于求解高阶常微分方程或具有多个因变量的常微分方程。为此,模板参数向量必须是具有适当定义的算术运算符的数字(或不同类型的向量)容器 因此,我正在寻找具有以下属性的Vector类型的实现: 类型是数字或不同类型向量的容器 适当地重载运算符运算符+,运算符-,运算符*和运算符/ 在调用代码中不使用使用这些运算符所必需的声明 标准库被重用 我想到的最好方法是在新名称空间中为std::array创建操作符 na

这个问题是由以下一阶常微分方程(ODE)积分龙格-库塔公式的实现引起的

但上述龙格-库塔码也可用于求解高阶常微分方程或具有多个因变量的常微分方程。为此,模板参数向量必须是具有适当定义的算术运算符的数字(或不同类型的向量)容器

因此,我正在寻找具有以下属性的
Vector
类型的实现:

  • 类型是数字或不同类型向量的容器
  • 适当地重载运算符
    运算符+
    运算符-
    运算符*
    运算符/
  • 在调用代码中不使用使用这些运算符所必需的声明
  • 标准库被重用
  • 我想到的最好方法是在新名称空间中为
    std::array
    创建操作符

    namespace StackOverflow {
    
      template<typename Field, typename Element, std::size_t Dim>
      auto
      operator*(Field lhs, const std::array<Element, Dim>& rhs);
    
      // etc., etc.
    }
    
    另一种可能是从
    std::array
    公开派生。这是可行的,但是,正如我所知道的,这是C++语言标准明确禁止的。
    有没有可能重用
    std::array
    ——保留上面的前四个属性——而不完全重写
    std::array

    可能就是你要找的?嗯,我考虑过
    std::valarray
    std::valarray
    的优点是:它在标准库中,而且(某种程度上)可以工作。
    std::valarray
    的缺点:添加向量时的长度检查不是在编译时进行的,它不是STL意义上的容器,很难打印,也很难测试。最后两点是由于这样一个事实,即出于优化目的,
    std::valarray
    运算符的返回类型是相当流畅的。因此,是的,
    std::valarray
    可能是一个答案,但我希望有更好的解决方案。
    boost::eigen
    作为OO线性代数的准标准实现存在,使用
    eigen
    库的ODE解算器的示例也存在。似乎没有满足我的约束条件的现成解决方案。通常的做法似乎是创建一个具有所需功能的新类型,即使这意味着重新实现标准库的一部分。
    double f(double t, double y) { return y; }
    
    namespace StackOverflow {
    
      template<typename Field, typename Element, std::size_t Dim>
      auto
      operator*(Field lhs, const std::array<Element, Dim>& rhs);
    
      // etc., etc.
    }
    
    using StackOverflow::operator+; ...