gpt4 book ai didi

c++ - 我可以使用 use_lazy_terminal 使终端的第一个参数变得懒惰 3 个参数吗?

转载 作者:太空狗 更新时间:2023-10-29 23:07:17 29 4
gpt4 key购买 nike

我在 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 )。因此,我可以将自定义消息从我的规则发送到自定义调试器,如您所见,它非常简单,我可以借助语义操作来完成此操作,但使用此技术并将其与在 Release模式下扩展为无的宏组合我可以简单地编写我的语法并调试我想要的任何语法。但是由于我的消息和规则名称是不变的,所以我将它们存储为 const char* 而不是 std::string 或类似的东西,所以我认为有可能首先从函数提供的参数但其余参数强制为文字?我可以在我的 use_terminal 特化中使用 const char (&) [N] 来强制用户使用字符串文字。

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

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

最佳答案

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

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

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

// or equivalently

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

这里,

  • 第一个参数是一个懒惰的 Actor
  • 第二个参数是一个文字,它的值(在本例中是一个const char(&)[10])将被绑定(bind)。这将在调用时作为 const char* 传递。 (action_dispatch)
  • 第三个将传递一个常量引用给实例,即它不会复制表达式模板初始化时的值。

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

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

总结

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

我希望你应该得到你想要的,只需将所有参数声明为“潜在惰性”1:

  • 它将复制您作为 Actor 传入的所有 Actor
  • 它将任何非 phoenix 值包装在 val actor 中——这与通用引用有点不同
  • 但是,最终生成的代码应该通过内联来“蒸发”该包装层

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


1 在此处寻找类似于 [universal references] 的术语:“推导”(编译为)的形式参数类型给 Actor 一个文字,这取决于传入的实际参数

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

关于c++ - 我可以使用 use_lazy_terminal 使终端的第一个参数变得懒惰 3 个参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13261185/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com