我可以使用use_lazy_terminal来设置一个终端的第一个参数来获得3个参数的延迟吗?

时间:2012-11-06 23:40:24

标签: c++ boost-spirit

我在boost::spirit中有一个自定义终端,我希望用户能够将我的终端的第一个参数作为惰性参数提供,其余的作为普通文字字符串。这可能是使用use_lazy_terminal,例如,如果在我的专业化中我使用:

template<>
struct use_lazy_terminal<qi::domain, my_custom_tag, 1 /*only first parameter*/>
    : mpl::true_ {};

@谢谢你的回答,我对这个问题的关注不是表现,我知道编译器会优化和......让我解释一下为什么我要创建自定义终端:

如你所知,qi语法的编译速度非常慢,找到错误的来源真的很难(与简单使用qi本身相比),所以我决定编写一个自定义终端得到这个:debug_position( debug_callback, rule_name, msg )。所以我可以将我的规则中的自定义消息发送到自定义调试器,因为您看到它非常简单,我可以借助语义操作来完成此操作,但是使用这种技术并将其与在发布模式下扩展为空的宏相结合我可以简单地编写我的语法并调试我想要的任何语法。但由于我的消息和规则名称是不变的,我将它们存储为const char*而不是std::string或类似的东西,所以我认为可以从函数提供的第一个参数,但其余的被迫文字?我可以在const char (&) [N]的专门化中使用use_terminal来强制用户使用字符串文字。

如你所见,我可以在没有这个的情况下生活,但我真的想知道,我能在精神上做到这一点吗?

我的源代码位于:http://pastebin.com/275S6Czu

1 个答案:

答案 0 :(得分:1)

我在这里看不到确切的问题。代码是否编译为文字或引用将取决于调用代码。

使用语义动作时更简单的例子:

rule1 = int_ [ myactor(_1, phx::val("thisvalue"), phx::cref(instance) ];

// or equivalently

rule1 = int_ [ myactor(_1, "thisvalue", phx::cref(instance) ];

下面,

  • 第一个参数是一个懒惰的演员
  • 第二个参数是 literal ,它的值(在这种情况下,const char(&)[10])将被绑定。这将在调用时作为const char*传递。 (action_dispatch
  • 第三个将const引用传递给instance,即它不会在expression template初始化时复制该值。

所有这些都是编译时泛型,这意味着您可以期望编译器生成相同的代码(启用优化),就像您编写直接函数调用一样

 myfunction(?, "thisvalue", instance); // assuming instance a const lvalue

<强>结论

我认为你可以忽略这个问题。我会说处理参数,因为懒惰的actor主要是编译时优化(例如,减少编译时间和模板实例化的优化)。

我希望你能得到你想要的东西,只需将 所有参数声明为“潜在的懒惰” 1

  • 它将复制您作为演员传入的任何演员
  • 它包含val actor中的任何非凤凰值 - 这与通用引用
  • 略有不同
  • 但是,最终生成的代码应该通过内联它来“蒸发”该包装层

注意我没有时间检查/演示我在上面做出的断言。我仍然把它扔到那里,所以你可以自己咀嚼它。


1 在这里寻找类似于[通用引用]的术语:形式参数类型'推导'(编译为)演员 一个文字,取决于传入的实际参数

当然,在这种情况下,文字将只包含在phx :: val