假设我们有:
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>
我认为它不会编译。然而,第一个例子会。问题是,我们如何保证返回类型不发生冲突?具体来说,当用作解析器的一部分时,在无数情况下我们都希望使用第一个示例。所以……
最佳答案
此代码未经测试,但我相信这会解决您的问题。
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,因为这是您传递给变体的内容。
编辑
好的,关于您添加的规则和结构缺少很多类型信息,所以我要继续说应该将这些添加到您的问题中。 我终于找到了你上一个问题中的定义。
暂时不考虑这一点,我现在最好的猜测是让标识符的规则返回一个实际的标识符而不是一个字符串(拥有一个标识符类型和一个标识符真的很困惑顺便说一句,但我知道你不是这样做的人)。
编辑 2
我不会再发表评论了,我会把它放在这里:
你有 qi::rule<Iterator, std::string(), skipper<Iterator> > identifier;
,它声明此规则的返回类型为 std::string
.将其更改为 qi::rule<Iterator, identifier(), skipper<Iterator> > identifier;
, 它将规则的返回类型声明为 identifier
.注意 std::string
的变化至 identifier
.让我知道这是否对您有帮助,或者您是否已经这样做过。
关于c++ - 如何绕过匹配的 Boost Variant 返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229428/