我的程序中有一个接受, ,等boost::variant
类型的程序。我正在存储这些,我想用它来生成/打印它们。我是新手,但我知道它适用于变体。我有什么选择呢?生成其中一个的简单语法/规则是什么样的?任何帮助都会很棒!double
uint16_t
std::string
boost::karma
boost::spirit
问问题
532 次
1 回答
3
1. 简单规则
我能想到的最简单的例子,展示了业力甚至可以为您的特定变体动态合成规则auto_
[ 1]:
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
int main() {
typedef boost::variant<double, unsigned int, std::string> V;
for(auto v : { V{42u}, V{3.1416}, V{"Life Of Pi"} })
std::cout << karma::format(karma::auto_, v) << "\n";
}
印刷:
42
3.142
Life Of Pi
非常简单!
单独语法中的等价物:Live On Coliru
2. 更复杂的样本
一个更复杂的语法(也是Live On Coliru),它向您展示了 Spirit 的属性兼容性如何神奇地规则 DoTheRightThing™:
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
typedef boost::variant<double, unsigned int, std::string> V;
struct gen : karma::grammar<boost::spirit::ostream_iterator, V()> {
gen() : gen::base_type(start)
{
using namespace karma;
start = my_real | my_uint | my_text;
my_uint = "The value is unsigned integral value (" << uint_ << ")";
my_real = "The value is double precision floating point value (" << double_ << ")";
my_text = "The value is an epos: '" << *quoted_char << "'";
quoted_char = '\\' << char_("'") | graph | "\\x" << uint_generator<uint8_t, 16>();
}
private:
karma::rule<boost::spirit::ostream_iterator, V()> start;
karma::rule<boost::spirit::ostream_iterator, double()> my_real;
karma::rule<boost::spirit::ostream_iterator, unsigned int()> my_uint;
karma::rule<boost::spirit::ostream_iterator, std::string()> my_text;
karma::rule<boost::spirit::ostream_iterator, uint8_t()> quoted_char;
};
int main()
{
for(auto v : { V{42u}, V{3.1416}, V{"It's a beautiful day!"} })
std::cout << karma::format(gen(), v) << "\n";
}
这打印:
The value is unsigned integral value (42)
The value is double precision floating point value (3.142)
The value is an epos: 'It\'s\x20a\x20beautiful\x20day!'
main
也可以写成
int main() {
std::cout << karma::format(gen() % "\n", std::vector<V>{42u,3.1416,"It's a beautiful day!"}) << "\n";
}
这应该让您了解 Spirit Parser/Generator 框架的多功能性。
[1]只要存在自动解析器生成器特征;Spirit 为它们提供了许多类型,包括、 和uint
(std::string
但也包括可选项、向量、映射、任何可以改编为 Fusion 序列等的东西)double
variant
于 2014-10-10T22:24:06.777 回答