如何解决与汽车发电机有关的Boost-spirit-karma和Boost-variant“概念”
| 我需要将“ 0”反序列化为其他对象提供的装饰。 “装饰”启用的功能之一是向量中的空条目。在我的实际实现中,我遇到了一堵砖墙。但是,我设法缩小包装。编译代码:#include <string>
#include <boost/spirit/include/karma.hpp>
#include <boost/variant.hpp>
#include <boost/cstdint.hpp>
namespace karma = boost::spirit::karma;
typedef boost::variant<boost::int32_t,boost::int64_t> custom_variant;
int main()
{
using karma::generate;
custom_variant v;
std::string temp;
std::back_insert_iterator<std::string> x(temp);
std::cout << v;
karma::generate(x,karma::auto_,v);
}
令人讨厌的更改,它们试图实现“未定义”类型以及所需的概念。
#include <string>
#include <boost/spirit/include/karma.hpp>
#include <boost/variant.hpp>
#include <boost/cstdint.hpp>
namespace karma = boost::spirit::karma;
struct undefined{};
std::ostream & operator<<(std::ostream & out,undefined const & undefined)
{
return out;
}
typedef boost::variant<undefined,boost::int32_t,v);
}
如果我注释掉karma::generate
步骤,则std::cout
是有效表达式(Boost :: variantOutputStreamable
)。 Spirit要求生成器的类型为OutputStreamable
(spirit :: karmaOutputStreamable
),并且上面的变体应为OutputStreamable
,因为我将undefined
类型OutputStreamable
设为无操作。
是什么赋予了 ? :(
我真的开始质疑,当使用具有大于2个级别的模板间接性的库时,C ++模板机制是值得的。也许我应该回到直线c。
编辑1:
好吧,lang给了我一个明智的first
错误...
error: no type named \'properties\' in \'boost::spirit::karma::no_auto_mapping_exists\'
现在,我要弄清楚如何将undefined映射为no-op以获得清晰的转换。这个精神文档条目(尤其是本文档)描述了我需要研究的内容。 Spirit是否提供了一个通用的未定义类型,或者是否已经将其映射为no-op?
编辑2:
spirit13ѭ开始显得很吸引人,因为精神为他们提供了类型演绎。
解决方法
我建议为此目的使用
spirit::unused_type
,因为它已经为Spirit提供了“已知”并且预定义了operator<<()
(但是其他任何类型都可以)-并不是说您真的需要Karma运算符。
此外,您还必须为create_generator
提供一个专业化名称(如您所怀疑):
namespace boost { namespace spirit { namespace traits
{
template <>
struct create_generator<spirit::unused_type>
{
typedef spirit::karma::eps_type type;
static type call()
{
return spirit::karma::eps;
}
};
}}}
它将unused_type
映射到karma::eps
。这似乎正是您所需要的,因为s20ѭ总是在成功的情况下不产生任何东西就吃了该属性。如果走这条路线,您将不需要使用optional<>
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。