我有binop
結構,它表示2個相同類型表達式的二進制運算。 我有兩種不同類型的表達式:arithmetic_expr
和logical_expr
定義爲boost :: variant。Boost recursive_wrapper遞歸
目標是讓binop
有兩個字段:rhs
和lhs
這些表達式的具體類型。如何實現這一目標?
這是我想出了迄今:
template <typename expr_type, typename tag> struct binop;
struct op_plus {};
typedef boost::variant<
int,
boost::recursive_wrapper<binop<arithmetic_expr, op_plus>> // <-- fails here 'arithmetic_expr': undeclared identifier
> arithmetic_expr;
struct op_and {};
typedef boost::variant<
bool,
boost::recursive_wrapper<binop<logical_expr, op_and>>
> logical_expr;
template <typename expr_type, typename tag>
struct binop
{
explicit binop(const expr_type& l, const expr_type& r) : lhs(l), rhs(r) { }
expr_type lhs, rhs;
};
用例的例子是:
(((1 + 2) /* arithmetic_expr */ + 3) /* arithmetic_expr */ AND (4 + 5) /* arithmetic_expr */) /* logical_expr */
我們可以通過定義的地方開始arithmetic_expr。我在上面的代碼中看不到它的定義。 –
如果我轉發declare arithmetic_expr作爲一個結構體,編譯器會抱怨變體聲明與結構體不兼容。 – 0xFF
是否要在您的變體中存儲綁定值,或者只是操作?即變體設計爲完整的表達式還是特定於領域的語言程序,將從其他地方接受輸入?你可以發佈一個用例的例子嗎? –