我尝试编译使用许多模板魔法(主要是元组)的旧代码(json到struct解析器),让我有可能像这样描述解析器命令:
auto mesh_parser = TupleParser<Mesh&>::create("Mesh list parser");
mesh_parser >> Ops::read("name") >> Ops::cast(&stringNotEmpty) >> Ops::write(&Mesh::name);
mesh_parser >> Ops::read("file") >> Ops::cast(&stringNotEmpty) >> Ops::write(&Mesh::file);
mesh_parser >> Ops::optional() >> Ops::read("submeshes") >> Ops::unlist() >> Ops::cast(&stringNotEmpty) >> Ops::write(&Mesh::submeshes);
此代码构建解析器链以将json(Qt库中的QJsonValue对象)解包为纯结构。
比解析:
Mesh output;
mesh_list_parser->parse(output, json_value);
// where json_value is QJsonValue with something like that:
// {"name":"foo","file":"bar.json","submeshes":["foo","bar","baz"]}
有时候这段代码很完美,但是g ++ 4.9尝试在我的代码中没有使用的变体中构建模板。
错误:
In file included from ../../Project/src/Render/meshmanager.cpp:4:0:
../../Project/src/Parse/tupleparser.h: In instantiation of 'struct _helpers::packer<Mesh&, QJsonValue>':
../../Project/src/Render/meshmanager.cpp:69:88: required from here
../../Project/src/Parse/tupleparser.h:1144:38: error: creating pointer to member reference type 'Mesh&'
using Field = FieldType Unref::*;
仅在调试和发布版本配置中Ops::cast
,Ops::write
(以及另外两个命令 - one_of
和or_else
)的首次使用时引发此错误。< / p>
Ops
- 具有解析器操作的命名空间。 Ops::cast
从_helpers::caster
模板返回对象。该对象存储指向cast函数的指针。
我有操作员使用强制助手:
template<...> ParserNode<%output_tuple_type%> operator >>(ParserNode<%input_tuple_type&>, _helpers::caster<From, To> cmd)
此运算符将新命令(在本例中为cast
)附加到解析链并返回新节点,但是......我不使用Ops::packer
(从{{1返回对象)有错误的行上的模板),因此对于具有此类元组类型的节点,无需为_helpers::packer
构建operator >>
。每个运算符都是独立编写的,而不是Ops::packer
模板类主体,所以我希望ParserNode
只构建所需的组合。
Qt项目文件中的这一行:
g++
修复了问题(g ++ 4.8可以构建我的代码),但这就像走路拐杖一样。
我可以设置一些额外的g ++参数(到QMAKE_CXX=g++-4.8
)以防止构建未使用的模板组合吗?不想重写这段代码,至少现在......