тип возвращаемого значения зависит от типа аргумента шаблона

#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 может быть только одно из двух значений, вам не нужно 2 if constexpr -е , самого else по себе будет достаточно: if constexpr (op == Ad) { return ...; } else { return ...; } только если позже будет добавлено больше значений if constexpr , потребуется больше.

2. Большое спасибо, это сделало свою работу!

3. @jbachmann если это решило вашу проблему, пожалуйста, отметьте ее как принятую, чтобы вопрос не остался без ответа.