2012-11-06 26 views
3

我在boost::spirit有一個自定義終端,我希望用戶能夠提供我的終端的第一個參數作爲lazy參數,其餘的作爲普通文字字符串。這可能使用use_lazy_terminal例如,如果在我的專業化使用:我可以使用use_lazy_terminal來獲取獲取3個參數的終端的第一個參數嗎?

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或類似的東西,所以我認爲有可能從函數提供的第一個參數但其餘的被強制爲文字?我可以在use_terminal的專門化中使用const char (&) [N]來強制用戶使用字符串文字。

正如你所見,我可以沒有這種生活,但我真的想知道,我能做到這一點在精神?

我的源代碼是:http://pastebin.com/275S6Czu

+0

我真的很想看到這個小例子。這兩者都是因爲我以前沒有用Spirit做過定製終端,並且因爲它可以幫助我看到你的擔憂在哪裏。 – sehe

+0

發現你的示例:適合我的工作:http://liveworkspace.org/code/a43775e74e34c3e1495aa3f907bf5040(消除MSVC錯誤後)。你想要什麼_altered_?我會用一些更正統的方法來更新我的答案來調試語法。 – sehe

+0

@sehe我的示例已經在工作,我已經在使用它來調試我的'rules'和'grammars',但是我想知道是否有任何方法可以從全局函數中獲取我的調試器實例並強制用戶提供2個其他參數作爲字符串字面?正如你在我的示例中看到的,我的調試器將它們捕獲爲原始指針。我知道我可以改變它'字符串',但我很好奇,有沒有什麼辦法只有第一個參數變得懶惰,另外2個應該提供值? – BigBoss

回答

1

我這裏看不到確切的問題。代碼是否編譯成文字或引用將取決於調用代碼。

非常簡單的例子使用語義動作時:

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

// or equivalently 

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

這裏,

  • 第一個參數是一個懶惰的演員
  • 第二個參數是一個文字,它的值(在這種情況下,const char(&)[10])將被綁定。這將在調用時作爲const char*傳遞。 (action_dispatch
  • 第三個將傳遞一個常量引用到instance,即它不會複製expression template初始化時的值。

所有這一切都是編譯時一般,這意味着你可以期望你的編譯器生成相同的代碼(啓用優化),因爲當你編寫了一個直接的函數調用

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

結束

我想你可以忽略這個問題。我會說而不是將參數視爲懶惰的參與者主要是編譯時優化(如在優化以減少編譯時間和模板實例化)。

我希望,你應該得到你想要的,由剛剛宣佈所有參數爲「潛在懶」

  • 它會複製你傳遞作爲演員
  • 任何演員
  • 它包含任何non-phoenix值在演員 - 這是有點不同於普遍引用
  • 但是,最終生成的代碼應該'蒸發'包裝層通過內聯它

注意我沒有時間來檢查/演示我在上面提出的斷言。我仍然把它扔在那裏,所以你可以咀嚼它。


尋找類似的[普遍引用]這裏的一個術語:一個正式參數類型是「推斷」(編譯成)到演員文字視實際論點得到通過。

當然,在這種情況下,文字將被包裹在phx :: val

+0

我添加說明和源代碼 – BigBoss

相關問題