是否有方法使用数学表达式作为函数参数?



我正在构建一个多项式类,我想构建一个这样的对象:

Variable x('x');
Polynomial p = 4(x^3) + 2(x^2) - 8;

我想知道是否有一种方法可以使用数学表达式来构造多项式。

我尝试使用va_list和" ter"类,但如果能像上面所示的那样做就更好了。

你没有把问题提清楚。我是这样理解你的问题的:

你希望在代码中描述多项式的方式类似于数学中使用的符号。

这可以通过利用操作符重载和提供helper类来实现。可以这样开始:
class Term {
public:
constexpr Term() noexcept = default;
constexpr Term(double x) noexcept
: m_order { 0 }
, m_coefficient { x }
{
}
constexpr Term(double x, size_t pow) noexcept
: m_order { pow }
, m_coefficient { x }
{
}
constexpr double coeff() const noexcept
{
return m_coefficient;
}
constexpr size_t order() const noexcept
{
return m_order;
}
constexpr Term negative() const noexcept
{
return { -m_coefficient, m_order };
}
private:
size_t m_order = 0;
double m_coefficient = 0.0;
};
class Polynomial {
public:
Polynomial() = default;
Polynomial(std::initializer_list<double> coeff)
: a { std::rbegin(coeff), std::rend(coeff) }
{
}
Polynomial(std::initializer_list<Term> terms)
: a {}
{
auto max_order = std::max_element(std::rbegin(terms), std::rend(terms), [](auto a, auto b) {
return a.order() < b.order();
})->order();
a.resize(max_order + 1, 0.0);
for (auto term : terms) {
a[term.order()] += term.coeff();
}
}
Polynomial(Term term)
{
addTerm(term);
}
Polynomial& addTerm(Term term)
{
a.resize(std::max(a.size(), term.order() + 1), 0.0);
a[term.order()] += term.coeff();
return *this;
}
double operator()(double x) const noexcept
{
double r = 0;
for (auto ai : a) {
r *= x;
r += ai;
}
return r;
}
public:
std::vector<double> a = { 0.0 };
};
constexpr Term operator^(Term term, size_t pow) noexcept
{
return { term.coeff(), term.order() * pow };
}
constexpr Term operator*(double a, Term b) noexcept
{
return { a * b.coeff(), b.order() };
}
Polynomial operator+(Term a, Term b)
{
return { a, b };
}
Polynomial operator+(Polynomial&& poly, Term b)
{
poly.addTerm(b);
return { std::move(poly) };
}
Polynomial operator-(Polynomial&& poly, Term term)
{
return std::move(poly) + term.negative();
}
constexpr auto x = Term { 1.0, 1 };

https://godbolt.org/z/8qWazo4MY

是的,这是可能的。但是没有语言支持。对于JavaScript或Python的eval(),在c++中没有等效的。所以不会那么容易的。

一个简单的方法是使用解释器模式来表示表达式。然后使用"上下文"执行表达式。它存储变量值的映射。更多的解释在这里。

还有其他方法,但最终,你必须解析表达式(如果它是字符串),创建某种抽象语法树,并为该树提供一个简单的执行引擎或一些更复杂的符号数学引擎,即可以在表达式树上应用数学规则(如因子分布等)。

而且,使用这些表达式作为形参的类在设计时必须预见到额外的工作。通常,如果使用解释器模式方法,您的多项式本身可能就是一个解释器,带有解释器参数。

最新更新