- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Boost Spirit Qi 解析当然是 C++ 的一个独特应用,它具有陡峭的学习曲线。在这种情况下,我试图解析一个字符串,该字符串包含一个 struct
的语法正确的 C++ 列表初始化。包含 std::vector
的 std::tuple<std::string, short>
.这是 struct
的声明:
typedef std::vector<std::tuple<std::string, int>> label_t;
struct BulkDataParmas
{
std::string strUUID;
short subcam;
long long pts_beg;
long long pts_len;
long long pts_gap;
label_t labels;
};
start
如果我也注释掉
vector
,则按预期工作
struct
的成员. (我也试过
std::pair
而不是
std::tuple
)。
BOOST_FUSION_ADAPT_STRUCT
(
BulkDataParmas,
(std::string, strUUID)
(short, subcam)
(long long, pts_beg)
(long long, pts_len)
(long long, pts_gap)
(label_t, labels)
)
template <typename Iterator>
struct load_parser : boost::spirit::qi::grammar<Iterator, BulkDataParmas(), boost::spirit::ascii::space_type>
{
load_parser() : load_parser::base_type(start)
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
using qi::attr;
using qi::short_;
using qi::int_;
using qi::long_long;
using qi::lit;
using qi::xdigit;
using qi::lexeme;
using ascii::char_;
using boost::proto::deep_copy;
auto hex2_ = deep_copy(xdigit >> xdigit >> xdigit >> xdigit);
auto hex4_ = deep_copy(hex2_ >> hex2_);
auto hex6_ = deep_copy(hex4_ >> hex2_);
auto fmt_ = deep_copy('"' >> hex4_ >> char_('-') >> hex2_ >> char_('-') >> hex2_ >> char_('-') >> hex2_ >> char_('-') >> hex6_ >> '"');
uuid = qi::as_string[fmt_];
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
label = '{' >> quoted_string >> ',' >> int_ >> '}';
start = '{' >> uuid >> ',' >> short_ >> ',' >> long_long >> ',' >> long_long >> ',' >> long_long >> ',' >> '{' >> -(label >> *(',' >> label)) >>'}' >> '}';
// start = '{' >> uuid >> ',' >> short_ >> ',' >> long_long >> ',' >> long_long >> ',' >> long_long >> '}';
}
private:
boost::spirit::qi::rule<Iterator, std::string()> uuid;
boost::spirit::qi::rule<Iterator, std::string()> quoted_string;
boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> label;
boost::spirit::qi::rule<Iterator, BulkDataParmas(), boost::spirit::ascii::space_type> start;
};
"{ \"68965363-2d87-46d4-b05d-f293f2c8403b\", 0, 1583798400000000, 86400000000, 600000000, { { \"motorbike\", 5 }, { \"aeroplane\", 6 } } };"
最佳答案
除了你提到的两件事(这是正确的),我建议
uuid = '"' >> qi::raw [
hex_<4>{} >> qi::repeat(3)['-' >> hex_<2>{}] >> '-' >> hex_<6>{}
] >> '"';
template<int N> using hex_ = boost::spirit::qi::int_parser<std::intmax_t, 16, 2*N, 2*N>;
raw[]
解析器将很好地公开匹配的源字符串。 quoted_string = '"' >> *~qi::char_('"') >> '"';
*
接受空字符串(这经常~charset
成为lexeme[]
因为无论如何都已经声明了规则而没有 skipper 。 label = '{' >> quoted_string >> ',' >> qi::int_ >> '}';
start = qi::skip(ascii::space) [ '{'
>> uuid >> ','
>> qi::auto_ >> ','
>> qi::auto_ >> ','
>> qi::auto_ >> ','
>> qi::auto_ >> ','
>> '{' >> -(label % ',') >> '}'
>> '}' >> ';'
];
phrase_parse
中繁琐地传递正确的东西. skipper 通常不是调用者应该能够改变的东西。 BOOST_FUSION_ADAPT_STRUCT(BulkDataParams, strUUID, subcam, pts_beg, pts_len, pts_gap, labels)
qi::auto_
的原因。在那里的开始规则中,所以你不会得到痛苦的惊喜,例如解析器结果以预期的方式隐式转换为目标类型。struct BulkDataParams {
std::string strUUID;
int16_t subcam;
int64_t pts_beg;
int64_t pts_len;
int64_t pts_gap;
label_t labels;
};
#define BOOST_SPIRIT_DEBUG
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>
#include <iostream>
#include <iomanip>
using label_t = std::vector<std::tuple<std::string, int>>;
namespace std {
std::ostream& operator<<(std::ostream& os, label_t::value_type const& t) {
auto const& [k,v] = t;
return os << "[" << std::quoted(k) << "," << v << "]";
}
std::ostream& operator<<(std::ostream& os, label_t const& m) {
os << "{";
for (auto&& el:m) os << el << ",";
return os << "}";
}
}
struct BulkDataParams {
std::string strUUID;
int16_t subcam;
int64_t pts_beg;
int64_t pts_len;
int64_t pts_gap;
label_t labels;
};
BOOST_FUSION_ADAPT_STRUCT(BulkDataParams, strUUID, subcam, pts_beg, pts_len, pts_gap, labels)
template <typename Iterator> struct load_parser : boost::spirit::qi::grammar<Iterator, BulkDataParams()> {
load_parser() : load_parser::base_type(start) {
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
uuid = '"' >> qi::raw [
hex_<4>{} >> qi::repeat(3)['-' >> hex_<2>{}] >> '-' >> hex_<6>{}
] >> '"';
quoted_string = '"' >> *~qi::char_('"') >> '"';
label = '{' >> quoted_string >> ',' >> qi::int_ >> '}';
start = qi::skip(ascii::space) [ '{'
>> uuid >> ','
>> qi::auto_ >> ','
>> qi::auto_ >> ','
>> qi::auto_ >> ','
>> qi::auto_ >> ','
>> '{' >> -(label % ',') >> '}'
>> '}' >> ';'
];
BOOST_SPIRIT_DEBUG_NODES(
(uuid) (quoted_string) (label) (start)
)
}
template<int N> using hex_ = boost::spirit::qi::int_parser<std::intmax_t, 16, 2*N, 2*N>;
private:
boost::spirit::qi::rule<Iterator, std::string()> uuid;
boost::spirit::qi::rule<Iterator, std::string()> quoted_string;
boost::spirit::qi::rule<Iterator, label_t::value_type(), boost::spirit::ascii::space_type> label;
boost::spirit::qi::rule<Iterator, BulkDataParams()> start;
};
int main() {
for (std::string const input : {
R"({ "68965363-2d87-46d4-b05d-f293f2c8403b", 0, 1583798400000000, 86400000000, 600000000, { { "motorbike", 5 }, { "aeroplane", 6 } } };)",
})
{
auto f = begin(input), l = end(input);
BulkDataParams bdp;
load_parser<std::string::const_iterator> p;
if (parse(f, l, p, bdp)) {
std::cout << "Parsed: " << boost::fusion::as_vector(bdp) << "\n";
} else {
std::cout << "Parse Failed\n";
}
if (f != l) {
std::cout << "Remaining unparsed: " << std::quoted(std::string(f,l)) << "\n";
}
}
}
Parsed: (68965363-2d87-46d4-b05d-f293f2c8403b 0 1583798400000000 86400000000 600000000 {["motorbike",5],["aeroplane",6],})
<start>
<try>{ "68965363-2d87-46d</try>
<uuid>
<try>"68965363-2d87-46d4-</try>
<success>, 0, 158379840000000</success>
<attributes>[[6, 8, 9, 6, 5, 3, 6, 3, -, 2, d, 8, 7, -, 4, 6, d, 4, -, b, 0, 5, d, -, f, 2, 9, 3, f, 2, c, 8, 4, 0, 3, b]]</attributes>
</uuid>
<label>
<try> { "motorbike", 5 },</try>
<quoted_string>
<try>"motorbike", 5 }, { </try>
<success>, 5 }, { "aeroplane"</success>
<attributes>[[m, o, t, o, r, b, i, k, e]]</attributes>
</quoted_string>
<success>, { "aeroplane", 6 }</success>
<attributes>[[[m, o, t, o, r, b, i, k, e], 5]]</attributes>
</label>
<label>
<try> { "aeroplane", 6 } </try>
<quoted_string>
<try>"aeroplane", 6 } } }</try>
<success>, 6 } } };</success>
<attributes>[[a, e, r, o, p, l, a, n, e]]</attributes>
</quoted_string>
<success> } };</success>
<attributes>[[[a, e, r, o, p, l, a, n, e], 6]]</attributes>
</label>
<success></success>
<attributes>[[[6, 8, 9, 6, 5, 3, 6, 3, -, 2, d, 8, 7, -, 4, 6, d, 4, -, b, 0, 5, d, -, f, 2, 9, 3, f, 2, c, 8, 4, 0, 3, b], 0, 1583798400000000, 86400000000, 600000000, [[[m, o, t, o, r, b, i, k, e], 5], [[a, e, r, o, p, l, a, n, e], 6]]]]</attributes>
</start>
关于c++ - boost 灵气 : binding to struct with vector of tuples,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60660550/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!