【问题标题】:returntype depending on template argument type返回类型取决于模板参数类型
【发布时间】:2022-01-09 10:50:48
【问题描述】:

所以我正在尝试编写一个算法导数,以推导/评估简单的多项式。 我的表达式逻辑如下:有常量和变量,组合成乘法或加法表达式。 在我的表达式类中,我有方法导数,它应该返回不同的表达式,具体取决于表达式是加法还是乘法。 这是我的代码:

enum OP_enum {Add, Multiply};

//********

template<typename T>
class Constant {
public:
    Constant(const T & v) : val_(v) {}
    T operator()(const T &) const {
        return val_;
    }
    Constant<T> derivative(){
        return Constant<T>(0);
    }
private:
    T val_;
};

//********

template <typename T>
class Variable {
public:
    T operator()(const T & x) const {
        return x;
    }
    Constant<T> derivative(){
        return constant(1);
    }
};

//********

template<typename L, typename R, OP_enum op>
class Expression {
public:
    Expression(const L & l, const R & r) : l_(l), r_(r) { }


    template <typename T>
    T operator()(const T & 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_;
};

//********


template<typename L, typename R>
Expression<L, R, Add> operator*(const L & l, const R & r) {
    return Expression<L, R, Add>(l, r);
}

template<typename L, typename R>
Expression<L, R, Multiply> operator+(const L & l, const R & r) {
    return Expression<L, R, Multiply>(l, r);
}

有没有办法可以很好地指定返回类型? (应该是

Expression<RETURN TYPE of derivation called on L, RETURN TYPE of derivation called on R, Add>
Expression<Expression<RETURN TYPE of derivation called on L, R, Multiply>, Expression<L, RETURN TYPE of derivation called on R, Multiply>, Add>

取决于是否推导了总和或产品)

我已经尝试了 std::conditional 和 decltype 的一些东西

【问题讨论】:

    标签: c++ templates return-type trailing-return-type


    【解决方案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

    【讨论】:

    • 由于op 只能是两个值之一,因此您不需要第二个if constexprelse 本身就足够了:if constexpr (op == Ad) { return ...; } else { return ...; } 仅当稍后添加更多值时将需要更多if constexpr
    • 非常感谢您完成了这项工作!
    • @jbachmann 如果它解决了您的问题,请将其标记为已接受,这样问题就不会悬而未决。
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多