gpt4 book ai didi

c++ - boost::spirit::气

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:24 26 4
gpt4 key购买 nike

考虑以下代码:(Boost.Spirit 2.5.1)

qi::parse(str.begin(), str.end(), (+qi::alpha)[[](const string& s){cout << s<< '\n';}]
>> (*(qi::char_(',') | qi::char_('\'')))
>> qi::uint_[[](int integer){cout << integer << '\n';}]);

[[](int integer){cout << integer << '\n';}]有效,但是 +qi::alpha 的类似代码没有。

如何更正代码?

最佳答案

Boost Spirit 尚不支持 C++0x/C++11 lambdas 1 编辑 显然支持有所改善(我今天早些时候使用旧的 boost 版本进行了测试)。现在使用 Boost 1_48 和 g++ 4.6.1,以下内容似乎对 just_work 有效。耶!

qi::as_string[]

我想会想知道 qi::as_string将暴露的属性作为 std::string而不是默认的 std::vector<CharT> :

    qi::parse(str.begin(), str.end(),
qi::as_string [ +qi::alpha ]
[
[](const std::string&){std::cout << s << '\n';}
]
>> (*(qi::char_(',') | qi::char_('\'')))
>> qi::uint_
[
[](int integer){std::cout << integer << '\n';}
]);

但在我看来语法不是很友好。相反,我更喜欢 phoenixV2:

    qi::parse(str.begin(), str.end(),
qi::as_string [ +qi::alpha ] [ std::cout << _1 << '\n' ]
>> (*(qi::char_(',') | qi::char_('\'')))
>> qi::uint_ [ std::cout << _1 << '\n' ]);

从句法上讲,这已经短了很多,也不那么隐晦了。看看

一个有点人为的例子,展示了其中的一些实际操作,加上将属性引用直接传递到 parse 中功能:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <algorithm>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

bool reverse(std::string& value)
{
std::reverse(value.begin(), value.end());
return true; // false makes the parsing fail
}

int main()
{
std::string str("sometext,123");

auto f(str.begin()), l(str.end());

std::string s;
unsigned int i;

qi::parse(f,l,
qi::as_string [ +qi::alpha ] [ reverse ]
>> qi::omit [ *qi::char_(",\'") ]
>> qi::uint_,

s, i);

std::cout << s << std::endl;
std::cout << i << std::endl;
}

输出:

txetemos
123

1 PhoenixV3 可能在 1_48 中对此有一些支持(尚未检查);你想要

 #define BOOST_RESULT_OF_USE_DECLTYPE
#define BOOST_SPIRIT_USE_PHOENIX_V3

参见例如http://boost.2283326.n4.nabble.com/Boost-Spirit-Phoenix-V3-An-Overview-td3583792.html

关于c++ - boost::spirit::气,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8600945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com