C++ 我可以使用_lazy_terminal使一个终端的第一个参数变为3个参数lazy吗?

C++ 我可以使用_lazy_terminal使一个终端的第一个参数变为3个参数lazy吗?,c++,boost-spirit,C++,Boost Spirit,我在boost::spirit中有一个自定义终端,我希望用户能够提供终端的第一个参数作为惰性参数,其余参数作为普通文本字符串。使用use\u lazy\u terminal是否可以实现这一点,例如,如果在我的专业中,我使用: template<> struct use_lazy_terminal<qi::domain, my_custom_tag, 1 /*only first parameter*/> : mpl::true_ {}; 模板 结构使用\u惰性\

我在
boost::spirit
中有一个自定义终端,我希望用户能够提供终端的第一个参数作为惰性参数,其余参数作为普通文本字符串。使用
use\u lazy\u terminal
是否可以实现这一点,例如,如果在我的专业中,我使用:

template<>
struct use_lazy_terminal<qi::domain, my_custom_tag, 1 /*only first parameter*/>
    : mpl::true_ {};
模板
结构使用\u惰性\u终端
:mpl::true{};
@非常感谢您的回答,我在这个问题上关心的不是性能,我知道编译器将进行优化和。让我解释一下创建自定义终端的原因:

正如您所知,
qi
语法的编译速度非常慢,而且查找错误源非常困难(与简单使用
qi
本身相比),因此我决定编写一个定制终端,以获得以下结果:
debug\u位置(debug\u回调,rule\u name,msg)
。因此,我可以将自定义消息从我的规则发送到自定义调试器,正如您所看到的,这非常简单,我可以借助语义操作来完成,但是使用这种技术,并将其与在发布模式下扩展为零的宏相结合,我可以简单地编写语法并调试我想要的任何语法。但是,由于我的消息和规则名称是常量,我将它们存储为
const char*
而不是
std::string
或类似的东西,因此我认为是否可以从函数提供的第一个参数开始,但其他参数必须是文本?在我的
use\u terminal
专门化中,我可以使用
const char(&)[N]
强制用户使用字符串文本

正如你所看到的,没有这个我可以活下去,但我真的想知道,我能在精神上做到这一点吗


我的源代码位于:

我看不出确切的问题。代码是否编译为文本或引用将取决于调用代码

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

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

// or equivalently

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

  • 第一个论点是懒惰的演员
  • 第二个参数是一个文本,它的值(在本例中,
    常量char(&)[10]
    )将被绑定。这将在调用时作为
    const char*
    传递。(
    行动\u调度
  • 第三个将向
    实例
    传递常量引用,即在
    表达式模板
    初始化时不会复制该值
所有这些都是编译时通用的,这意味着您可以期望编译器生成与编写直接函数调用时相同的代码(启用了优化)

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

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

我希望通过将所有参数声明为“潜在懒惰”1,您应该得到您想要的:

  • 它将复制您作为演员传入的任何演员
  • 它将任何非phoenix值封装在val actors中-这与通用引用有点不同
  • 然而,最终生成的代码应该通过内联将包装层“蒸发”掉
注意我没有时间检查/演示我在上面所做的断言。我还在把它扔出去,这样你就可以好好想想了


1在这里寻找一个类似于[universal references]的术语:一种形式参数类型,根据传入的实际参数“推断”(编译为)到参与者文本


当然,在本例中,文字将被包装在phx::val中

我非常希望看到一个这样的小例子。这两个原因都是因为我以前没有用Spirit做过定制终端,也因为它可能会帮助我了解你的担忧到底在哪里。发现了你的样本:对我来说很好:(在解决了MSVC的bug之后)。你到底想要什么?我将用一些更正统的方法来调试语法来更新我的答案。@sehe我的示例已经在运行,我已经在用它来调试我的
规则
语法
,但我想知道是否有任何方法可以从全局函数获取我的调试器实例,并强制用户提供另外两个参数作为字符串文本??正如您在我的示例中看到的,我的调试器将它们捕获为原始指针。我知道我可以更改它
字符串
,但我很好奇有没有办法,只有第一个参数变懒,另外两个参数应该作为值提供??