#c #templates #return-type #trailing-return-type
#c #шаблоны #возвращаемый тип #тип конечного возврата
Вопрос:
Поэтому я пытаюсь написать алгоритмический дериватор для вывода/оценки простых многочленов. Моя логика выражения такова: существуют константы и переменные, объединенные в выражение умножения или сложения. В моем классе выражений у меня есть производная метода, которая должна возвращать разные выражения в зависимости от того, является ли выражение сложением или умножением. вот мой код:
enum OP_enum {Add, Multiply}; //******** templatelt;typename Tgt; class Constant { public: Constant(const T amp; v) : val_(v) {} T operator()(const T amp;) const { return val_; } Constantlt;Tgt; derivative(){ return Constantlt;Tgt;(0); } private: T val_; }; //******** template lt;typename Tgt; class Variable { public: T operator()(const T amp; x) const { return x; } Constantlt;Tgt; derivative(){ return constant(1); } }; //******** templatelt;typename L, typename R, OP_enum opgt; class Expression { public: Expression(const L amp; l, const R amp; r) : l_(l), r_(r) { } template lt;typename Tgt; T operator()(const T amp; x) const { switch (op) { case Add: return l_(x) r_(x); case Multiply: return l_(x) * r_(x); } } /*RETURN TYPE*/ derivative() { switch (op) { case Add: return l_.derivative() r_.derivative(); case Multiply: return l_.derivative() * r_ l_ * r_.derivative(); } } private: L l_; R r_; }; //******** templatelt;typename L, typename Rgt; Expressionlt;L, R, Addgt; operator*(const L amp; l, const R amp; r) { return Expressionlt;L, R, Addgt;(l, r); } templatelt;typename L, typename Rgt; Expressionlt;L, R, Multiplygt; operator (const L amp; l, const R amp; r) { return Expressionlt;L, R, Multiplygt;(l, r); }
есть ли способ, которым я могу красиво указать ТИП ВОЗВРАЩАЕМОГО значения? (это должно быть
Expressionlt;RETURN TYPE of derivation called on L, RETURN TYPE of derivation called on R, Addgt; Expressionlt;Expressionlt;RETURN TYPE of derivation called on L, R, Multiplygt;, Expressionlt;L, RETURN TYPE of derivation called on R, Multiplygt;, Addgt;
в зависимости от того, выводится ли сумма или продукт)
я пробовал std::условный и несколько вещей с decltype
Ответ №1:
auto derivative() { if constexpr (op == Ad) return l_.derivative() r_.derivative(); else if constexpr (op == Multiply) return l_.derivative() * r_ l_ * r_.derivative(); }
Это if constexpr
требуется, если ветви выводят к разным типам.
Комментарии:
1. Поскольку
op
может быть только одно из двух значений, вам не нужно 2if constexpr
-е , самогоelse
по себе будет достаточно:if constexpr (op == Ad) { return ...; } else { return ...; }
только если позже будет добавлено больше значенийif constexpr
, потребуется больше.2. Большое спасибо, это сделало свою работу!
3. @jbachmann если это решило вашу проблему, пожалуйста, отметьте ее как принятую, чтобы вопрос не остался без ответа.