Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 精神助推x3(A | A)属性类型为变体<;A、 ?>;而不是_C++_Boost_Boost Spirit_Boost Spirit X3 - Fatal编程技术网

C++ 精神助推x3(A | A)属性类型为变体<;A、 ?>;而不是

C++ 精神助推x3(A | A)属性类型为变体<;A、 ?>;而不是,c++,boost,boost-spirit,boost-spirit-x3,C++,Boost,Boost Spirit,Boost Spirit X3,我正在尝试创建一个简单的解析器,它使用boost::spirit::x3获取两个可能的字符之一。问题是x3::char_('#')|x3::char_('.')似乎有一个boost::variant类型的属性。这意味着我必须在\u attr上使用boost::get,而它应该可以直接转换为字符 ,上面写着A | A->A 如果使用注释掉的mapChars版本,则可以将其转换为char,但不能转换为 我使用的是boost 1.63.0版和Linux。使用-std=c++14在g++和clang++

我正在尝试创建一个简单的解析器,它使用
boost::spirit::x3
获取两个可能的字符之一。问题是
x3::char_('#')|x3::char_('.')
似乎有一个
boost::variant
类型的属性。这意味着我必须在
\u attr
上使用
boost::get
,而它应该可以直接转换为
字符

,上面写着
A | A->A

如果使用注释掉的
mapChars
版本,则可以将其转换为
char
,但不能转换为

我使用的是boost 1.63.0版和Linux。使用
-std=c++14
在g++和clang++上编译代码失败

我做错了什么

#include <iostream>
#include <string>

#include <boost/spirit/home/x3.hpp>

int main() {
    std::string s("#");
    namespace x3 = boost::spirit::x3;
    auto f = [](auto & ctx) {
        auto & attr = x3::_attr(ctx);
        //char c = attr; // doesn't work
        char c = boost::get<char>(attr); // does work
    };
    auto mapChar = x3::char_('#') | x3::char_('.'); // _attr not convertible to char, is a variant
    //auto mapChar = x3::char_('#'); // _attr convertible to char, isn't a variant
    auto p = mapChar[f];
    auto b = s.begin();
    bool success = x3::parse(b, s.end(), p);
    std::cout << "Success: " << success << ' ' << (b == s.end()) << '\n';
}
#包括
#包括
#包括
int main(){
std::字符串s(“#”);
名称空间x3=boost::spirit::x3;
自动f=[](自动和ctx){
自动&attr=x3::_attr(ctx);
//char c=attr;//不起作用
char c=boost::get(attr);//有效
};
auto mapChar=x3::char_u('.#')| x3::char_('.');//attr不可转换为char,是一个变体
//auto mapChar=x3::char_u389;('#');//\u attr可转换为char,不是一个变体
自动p=mapChar[f];
自动b=s.begin();
bool success=x3::parse(b,s.end(),p);

std::cout您是对的,它应该是兼容的,事实上它已经是:

auto const& attr = x3::_attr(ctx);
char c;
x3::traits::move_to(attr, c);
Spirit的属性兼容性规则(加上定制点)就是承载这种语义的工具


我同意你的观点,如果属性类型可以直接简化为
char
,那么这可能是一个很好的可用性改进,但我认为这会进一步影响未来的结果。

如果你的语义操作按值获取属性,那么它应该会起作用:

char result = 0;

auto f = [&result](char c){ result = c; };

auto mapChar = x3::char_('#') | x3::char_('.');
auto p = mapChar[f];
auto b = s.begin();
bool success = x3::parse(b, s.end(), p);

我认为,
x3::char_389;(“#”)
应该做你想做的事情。当然,这并不能解决
A | A->variant
的问题。对于这个示例,我尝试了非常等效的方法,并且基本上给出了相同的错误(
从不兼容的类型分配给char…
)。在这种情况下,
x3::traits::move__to
似乎只是在做
dest=std::move(src);
,这不会改变任何东西。@aeubanks-Mmm。你是对的。我一定是做错了什么。同时,你可以使用规则强制()这就方便多了:如果您觉得应该讨论这方面的改进,您可以通过[spirit general]邮件列表与开发人员联系