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

Qi 语法可能如下所示:

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

这意味着,函数是否为 const 存储在 bool 中。

如何用 Karma 编写相应的生成器?
function_ %= type_ << ' ' << id_ << "()" << XXX[" const"];

在这里,我们想要一个使用 bool 属性的指令,如果属性是 true 则执行嵌入式生成器,否则不执行任何操作。我们想要使以下测试成功的东西。
test_generator_attr("abc", XXX["abc"], true);
test_generator_attr("", XXX["abc"], false);

Boost.Spirit 中是否已经提供了这样的指令?

最佳答案

此刻进入我脑海的第一件事是

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()

关于boost - 如果 bool 属性为真,则生成字符串(与 qi::matches 的因果关系对应),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25502777/

10-16 17:39
查看更多