我需要std::vector<boost::variant<..>>
用其他对象提供的装饰反序列化 a 。
“装饰”启用的一件事是向量中的一个空条目。我在实际实施中遇到了障碍。但是,我设法将其收缩包装。编译的代码:
#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, 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);
}
如果我注释掉这karma::generate
一步,std::cout
是一个有效的表达式(Boost::variant OutputStreamable
)。Spirit 要求为生成器提供OutputStreamable
(spirit::karma OutputStreamable
) 类型,并且上面的变体应该是OutputStreamable
,因为我已将该undefined
类型OutputStreamable
设置为无操作。
是什么赋予了 ?:(
当使用具有> 2级模板间接的库时,我真的开始质疑 C++ 模板机制是否值得。也许我应该回到直接-c。
编辑1:
好的,Clang 给了我一个合理的first
错误......
error: no type named 'properties' in 'boost::spirit::karma::no_auto_mapping_exists'
现在我必须弄清楚如何将 undefined 映射为无操作以获得干净的转换。这个精神文档条目(特别是这个)描述了我需要研究的内容。是否存在由 Spirit 提供的通用未定义类型或在 boost 中定义的类型,该 Spirit 已经映射为 no-op ?
编辑2:
std::vector<boost::optional<boost::variant<..>>>
开始看起来很有吸引力,因为精神为他们提供了类型推断。