Я пытаюсь понять шаблоны C ++. Сначала я попытался сделать шаблоны C ++ для представления целочисленного полиномиального выражения. так как я новичок, я боюсь, что мог что-то пропустить и что может быть ошибка, и я буду рад комментариям к моему коду:
class Literal {
public:
Literal(const double v) : _val(v) {}
double eval() const { return _val; }
private:
const double _val;
};
class Variable {
public:
Variable(double& v) : _val(v) {}
double eval() const { return _val; }
private:
double& _val;
};
template <class ExprT1, class ExprT2, class BinOp>
class BinaryExpr {
public:
BinaryExpr(ExprT1 e1, ExprT2 e2, BinOp op = BinOp())
: _expr1(e1), _expr2(e2), _op(op) {}
double eval() const
{
return _op(_expr1.eval(), _expr2.eval());
}
private:
ExprT1 _expr1;
ExprT2 _expr2;
BinOp _op;
};
template <class ExprT1, class ExprT2>
BinaryExpr<ExprT1, ExprT2, std::plus<double>>
makeSum(ExprT1 e1, ExprT2 e2)
{
return BinaryExpr<ExprT1, ExprT2, std::plus<double>>(e1, e2);
}
template <class ExprT1, class ExprT2>
BinaryExpr<ExprT1, ExprT2, std::minus<double>>
makeMinus(ExprT1 e1, ExprT2 e2)
{
return BinaryExpr<ExprT1, ExprT2, std::minus<double>>(e1, e2);
}
template <class ExprT1, class ExprT2>
BinaryExpr <ExprT1, ExprT2, std::multiplies<double> >
makeProd(ExprT1 e1, ExprT2 e2)
{
return
BinaryExpr<ExprT1, ExprT2, std::multiplies<double> >(e1, e2);
};
template<class T>
struct pows
{
constexpr T operator()(const T& base, const T& exponent) const
{
return (exponent == 0) ? 1 : (base * pow(base, exponent - 1));
}
};
template <class ExprT1, class ExprT2>
BinaryExpr <ExprT1, ExprT2, pows<double>>
makePow(ExprT1 e1, ExprT2 e2)
{
return
BinaryExpr<ExprT1, ExprT2, pows<double> >(e1, e2);
};
double someFunction(double x)
{
//return makeProd(makeSum(Variable(x), Literal(2)), Literal(3)).eval();
return makeSum(makeSum(makePow(Variable(x), Literal(4)), makePow(makeMinus(Variable(x), Literal(2)), Literal(2))), makeSum(makeProd(Variable(x), Literal(3)), Literal(5))).eval();
}
void main()
{
cout << someFunction(4) << endl;
system("pause");
}
Также я хочу создать шаблон, который берет выражение из части 1 и возвращает выражение, представляющее производную входного выражения. Честно говоря, как я реализовал свой первый шаблон, я понятия не имею, нахожусь ли я на правильном пути.
Сначала я попытаюсь представить два простейших правила:
e + f) '= (e') + (f ')
(e n ) '= n * e n-1 * (e)'
Означает ли это, что, например, для отклонения функции pow я могу создать
template<BinaryExpr <ExprT1, ExprT2, pows<double>>
DeviatePow(ExprT1 e1, ExprT2 e2)
{
return
BinaryExpr<ExprT1, ExprT2, pows<double>(makeProd(e2, MakePow(e1,makeMinus(e2, Literal(1))));
};
Буду рад любым предложениям с чего начать! Спасибо