C ++ шаблон для полинома и отклонения - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь понять шаблоны 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))));
};

Буду рад любым предложениям с чего начать! Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...