3

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

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

@sehe 非常感谢您的回答,我对这个问题的关注不是性能,我知道编译器会优化和 ... 。让我解释一下我创建自定义终端的原因:

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

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

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

4

1 回答 1

1

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

使用语义操作时更简单的示例:

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

// or equivalently

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

这里,

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

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

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

结束语

我认为你可以忽略这个问题。我想说将参数视为惰性参与者主要是编译时优化(例如,减少编译时间和模板实例化的优化)。

我希望你应该得到你想要的,只需将所有参数声明为 'potentially lazy' 1

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

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


1在这里寻找类似于 [ universal references ] 的术语:一种形式参数类型,它根据传入的实际参数“推导”(编译为)演员或文字。

当然,在这种情况下,文字只会被包裹在 phx::val 中

于 2012-11-07T10:44:21.077 回答