Boost 如果布尔属性为真,则生成字符串(与qi::matches对应的karma) P>想象一下,我们想用Boo.So..P/>解析和生成简单的C++成员函数声明。

Boost 如果布尔属性为真,则生成字符串(与qi::matches对应的karma) P>想象一下,我们想用Boo.So..P/>解析和生成简单的C++成员函数声明。,boost,boost-spirit,boost-spirit-karma,Boost,Boost Spirit,Boost Spirit Karma,Qi语法可能如下所示: function_ %= type_ > id_ > "()" > matches["const"]; 这意味着,函数是否为const存储在bool中 如何使用Karma编写相应的生成器 function_ %= type_ << ' ' << id_ << "()" << XXX[" const"]; Boost.Spirit中已经有这样的指令了吗?现在我首先想到的是 bool const_quali

Qi语法可能如下所示:

function_ %= type_ > id_ > "()" > matches["const"];
这意味着,函数是否为
const
存储在
bool

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

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

Boost.Spirit中已经有这样的指令了吗?

现在我首先想到的是

bool const_qualifier = true;

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

是 啊我认为
symbols
方法是我见过的最干净的方法。更新答案。
symbols
方法很棒(尽管如果“主题生成器”比简单字符串更复杂,它就不起作用)。你最初的方法让我想起了他们在哪里使用的东西,比如
&true@cv\u和他同意的东西。对于更复杂的分支(使用
karma::lazy
karma::symbols
(!bool_(true)|“const”)
可能是最简洁的。尽管如此,生成器指令会使代码更易于阅读。@sehe@purpleKarrot在尝试实现生成器指令时,我确信如果“主题生成器”很复杂,那么使用
boost::optional
和Karma的可选生成器操作符会更好,所以我想将我之前的评论修改为“symbols
方法非常好。”。您可以找到一个非常命名(实际上未经测试)的指令,我认为它可以满足您对具有未使用属性的嵌入式生成器的需求。
bool const_qualifier = true;

std::cout << karma::format(
      karma::omit[ karma::bool_(true) ] << " const" | "",
      const_qualifier);
#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()