如何绕过匹配Boost Variant返回类型?

时间:2015-12-11 17:41:46

标签: c++ boost boost-variant

Linked Question

假设我们有:

boost::variant<nil, std::string, string_struct>

struct string_struct
{
   string_struct(std::string const& name = "") : name(name) {}
   std::string name;
}

是否有某种方法可以防止编译器错误地推断错误的boost变体类型?

理论上,如果我们有一个

boost::variant<std::string, std::string>

我认为它不会编译。然而,第一个例子。问题是,我们如何保证返回类型不会发生冲突?具体来说,当用作解析器的一部分时,有无数的实例我们希望第一个例子。所以...

1 个答案:

答案 0 :(得分:1)

此代码未经测试,但我相信这将解决您的问题。

    struct string_struct
    {
        explicit string_struct(const std::string & s):name(s){}
    };

    typedef boost::variant<nil, std::string, string_struct> var_t;

    var_t v1 = std::string("Hello");
    var_t v2 = string_struct("Hello");

var1将被明确初始化为保存字符串,因为构造string_struct必须显式调用其构造函数。当然,var2将被初始化为包含string_struct,因为这是您传递给变体的内容。

修改

好的,你添加的规则和结构中缺少很多类型信息,所以我会继续说这些信息应该添加到你的问题中。我终于在你上一个问题中找到了定义。

暂时忽略这一点,我现在最好的猜测就是让标识符的规则返回实际的标识符而不是字符串(标识符类型和标识符真的很混乱)规则btw,但我意识到你不是那样做的人。)

编辑2

我不会发表另一条评论,而是将其放在这里:

您有qi::rule<Iterator, std::string(), skipper<Iterator> > identifier;,它将此规则的返回类型声明为std::string。将其更改为qi::rule<Iterator, identifier(), skipper<Iterator> > identifier;,将规则的返回类型声明为identifier。请注意从std::stringidentifier的更改。如果这对您有帮助,或者您已经这样做了,请告诉我。