多変数多項式のコンパイル時クラスを作成しようとしています (つまり、P(X,Y,Z) = X^2 + XYZ + YZ のように、ここでは数学についてあまり心配しないでください):
template<int DIM, int DEGREE> class Polynomial {
public:
constexpr Polynomial(std::array<double,nbOfCoeffs(DIM,DEGREE)> arr): coeffs(arr) {}
constexpr double eval(std::array<double,DIM> x);
constexpr operator+,-,*,/ ...
private:
std::array<double,nbOfCoeffs(DIM,DEGREE)> coeffs; //don't worry about "nbOfCoeffs" : it is constexpr and computes at compile time the right number of coefficients.
}
int main () {
Polynomial<2,2> P({{1.,1.,1.,1.,1.,1.}}); // P(X,Y) = X^2+XY+Y^2+X+Y+1
double x = P.eval(1.);
auto P2 = P*P;
}
これまでのところ、これを実装するのに大きな問題はありません。ただし、私の ctor は少し面倒な場合があることに注意してください。3 次三変数多項式 P(X,Y,Z) = XYZ を初期化するにはどうすればよいですか? 私は次のようなものを持っているでしょう
Polynomial<3,3> P({{0.,0.,0.,0.,0.,1.,0.,0.,0.,0.}});
保存する場所に応じて、ゼロ以外の単項式のみの位置を使用します。私がちょうど書くことができればいいでしょう:
Polynomial<3,3> P("XYZ");
Polynomial<4,3> P("X1X2X3 + X4^2"); //more general
アイデアは、多項式の文字列表現を処理するために、ある種の小さな DST を作成することです。
ただし、これを行うと、文字列が解析されると、格納している配列の要素に値を割り当てる方法がわかりません。ctor の本体を空のままにしておく必要があります (constexpr にしたいため)。どう思いますか ?出来ますか ?配列をある種の繰り返し構造に変更する必要があります (この場合、非常に複雑になると思うため)