【发布时间】:2019-10-26 19:21:12
【问题描述】:
我有以下基类:
class BaseVisitor
{
public:
virtual ~BaseVisitor() {};
};
template <class T>
class Visitor
{
public:
virtual void visit(T&) = 0;
};
template <class Visitable>
class Expression
{
public:
template <typename T>
void accept(T& visitor)
{
visitor.visit(static_cast<Visitable&>(*this));
}
void print() {
static_cast<Visitable*>(this)->print();
}
void eval() {
static_cast<Visitable*>(this)->eval();
}
};
以及继承自 Expression 的类:
class Literal : public Expression<Literal>
{
protected:
int value = 0;
public:
Literal() {};
Literal(int x);
std::string print();
int eval();
};
class Add : public Expression<Add>
{
protected:
Literal lhs;
Literal rhs;
public:
Add(Literal left, Literal right);
void print();
int eval();
};
我希望能够将表达式传递给 Add 构造函数,这样我就可以调用 Add(Add(Literal(10),Literal(20)),Literal(30)).eval() 得到 50。
这在 C++11 中可行吗?
【问题讨论】:
-
是的,这在 C++ 中是可能的,但很复杂。您要查找的搜索词是expression templates(本文在底部列出了一些您可以研究的示例)。