この質問は、 1次常微分方程式 (ODE)の積分に対するルンゲ クッタ公式の次の実装によって動機付けられます。
template <typename Field, typename Vector>
auto
runge_kutta(const Vector& y,
std::function<Vector(Field, const Vector&)> rhs,
Field t, Field delta_t)
{
Vector k1 = rhs(t, y);
Vector k2 = rhs(t + delta_t/2, y + delta_t/2*k1);
Vector k3 = rhs(t + delta_t/2, y + delta_t/2*k2);
Vector k4 = rhs(t + delta_t, y + delta_t * k3);
return y + delta_t/6*(k1 + 2*k2 + 2*k3 + k4);
}
これは、次のような機能を統合するために使用できます。
double f(double t, double y) { return y; }
しかし、上記のルンゲ クッタ コードは、高次の ODE または複数の従属変数を持つ ODE を解くためにも使用できます。このために、テンプレート パラメーター Vector は、適切に定義された算術演算子を含む数値 (または異なる種類のベクトル) のコンテナーである必要があります。
Vector
したがって、次のプロパティを持つ型の実装を探しています。
- 型は、数値または異なる種類のベクトルのコンテナーです。
- 適切にオーバーロードされた演算子
operator+
、operator-
、operator*
およびoperator/
。 - これらの演算子を使用するために必要な呼び出しコードでの using 宣言はありません。
- 標準ライブラリが再利用されます。
私が思いついた最善の方法は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.
}
呼び出しコードに適切な using 宣言がある (上記のポイント 2 に違反する)
using StackOverflow::operator+; ...
もう 1 つの可能性は、 から公に派生させることstd::array
です。これは機能しますが、私が学んだように、これは C++ 言語標準によって明示的に禁止されています。
完全std::array
に書き直さずに、上記の最初の 4 つのプロパティを保持して再利用することは可能ですか?std::array