У меня есть несколько шаблонов, подобных приведенным ниже, которые я могу использовать для определения простых выражений, например
Expr<constant,int,int,1,1>
= 2
Expr<sub, Expr<constant,int,int,1,1>, Expr<constant,int,int,2,0>, 1, 1>
= x - 2.
Я хочу определить мета-функцию, которая принимает Expr и возвращает другой Expr, который является модифицированной версией той, которая передается в качестве входных данных. Выходные данные будут основаны на аргументах шаблона входных данных, поэтому я должен определить несколько шаблонов функций, которые специализируются на различных входных данных. В конечном итоге моя цель состоит в том, чтобы иметь возможность различать Expr.
// the types of expressions (+,-,*, etc.)
enum ExprType { mul, divide, add, sub, constant};
// constant
template <ExprType eType, class Left, class Right, int coeff, int power> struct Expr {
static double eval(double x){
return coeff * std::pow(x, power);
}
};
//sub
template <class Left, class Right, int coeff, int power> struct Expr<sub, Left, Right, coeff, power> {
static double eval(double x){
return coeff * std::pow(Left::eval(x) - Right::eval(x), power);
}
};
// add
template <class Left, class Right, int coeff, int power> struct Expr<add, Left, Right, coeff, power> {
static double eval(double x){
return coeff * std::pow(Left::eval(x) + Right::eval(x), power);
}
};
Однако у меня возникают проблемы, когда я оборачиваюсь вокруг определения функции. Пока у меня есть:
template <template <ExprType eType, class Left, class Right, int coeff, int power> class E> struct ExprDerivative {
static E derivative(E e){
return e;
}
};
Я иду в правильном направлении? Как определить мета-функцию над шаблонами?