如果布尔属性为真,则生成字符串(与qi :: matches匹配的karma)

时间:2014-08-26 09:48:40

标签: boost boost-spirit boost-spirit-karma

想象一下,我们想用Boost.Spirit解析并生成简单的C ++成员函数声明。

Qi语法可能如下所示:

function_ %= type_ > id_ > "()" > matches["const"];

这意味着,该功能是否const存储在bool

如何使用Karma编写相应的生成器?

function_ %= type_ << ' ' << id_ << "()" << XXX[" const"];

在这里,我们需要一个使用布尔属性的指令,如果属性为true则执行嵌入式生成器,否则不执行任何操作。我们想要一些使得以下测试成功的东西。

test_generator_attr("abc", XXX["abc"], true);
test_generator_attr("", XXX["abc"], false);

Boost.Spirit中是否已提供此类指令?

1 个答案:

答案 0 :(得分:2)

目前进入我脑海的第一件事是

bool const_qualifier = true;

std::cout << karma::format(
      karma::omit[ karma::bool_(true) ] << " const" | "",
      const_qualifier);

感觉有点......笨拙。我稍后会看一下我忘记的事情:)

更新以下使用karma::symbols<>稍微优雅一点:

#include <boost/spirit/include/karma.hpp>

namespace karma = boost::spirit::karma;

int main()
{
    karma::symbols<bool, const char*> const_;
    const_.add(true, "const")(false, "");

    for (bool const_qualifier : { true, false })
    {   
        std::cout << karma::format_delimited("void foo()" << const_, ' ', const_qualifier) << "\n";
    }   
}

打印:

void foo() const 
void foo()