2013-02-14 52 views
2

說我有一個Boost.Phoenix lambda表達式,如下所示:我可以在編譯時告訴Boost.Phoenix lambda的一組特定輸入類型是否有效?

_1 * 4.5 + (3.0/_2) 

有沒有給出一個很好的方式,在編譯時,檢測lambda表達式是否有效,與論據相關類型列表_1_2等等?我在想,我想用enable_if來確定輸入類型是否受lambda支持。如果是這樣,lambda將被直接調用,如果沒有,我想生成一個no-op。僞代碼將是這樣的:

template <typename F, typename A1, typename A2> 
enable_if<F::is_supported<A1, A2>, result_of<F(A1,A2)>::type >::type func(F func, A1 arg1, A2 arg2) 
{ 
    func(A1, A2); 
} 

template <typename F, typename A1, typename A2> 
disable_if<F::is_supported<A1, A2> >::type func(F func, A1 arg1, A2 arg2) 
{ 
} 

我只是不知道如何is_supported將實施,還是它甚至有可能。我沒有使用C++ 11;我只會假設C++ 03(因爲Phoenix需要它)。

+0

「*我只會假設C++ 03(因爲Phoenix需要它)*」Phoenix在C++ 11下工作良好。 – ildjarn 2013-02-14 22:15:50

+0

@ildjam:對不起,我不是故意暗示的。我的意思是說Phoenix至少需要C++ 03,所以假設它至少是C++ 98。 – 2013-02-14 23:39:00

+0

啊,理解。 – ildjarn 2013-02-14 23:57:07

回答

1

我認爲鳳凰城不可能像今天這樣。爲了支持這種使用,在每個級別上,即使在菲尼克斯所依賴的其他庫中,菲尼克斯在eval調用鏈中所做的幾乎每個函數調用都必須使用enable_if。我知道菲尼克斯不是這樣寫的,很難想象,在Phoenix,Proto和他們所依賴的所有庫被重寫爲純C++ 11之前,對代碼的任何破解都可能使它成爲現實。即使那樣,它也需要非常小心,所有潛在的錯誤都出現在SFINAE內容中。

我只是沒有看到它發生,對不起。

+0

感謝您的輸入;我當然相信你的意見。我可能會稍微修改一下我的要求,看看我能否得到任何可行的結果。或者,我可以直接使用Boost.Proto創建我想要的內容。 – 2013-02-15 20:17:35

+0

即使我推薦這個,我仍然猶豫不決,因爲代碼仍在不斷髮展,但我的C++ 11重寫Proto可能是一個更好的起點:https://github.com/ericniebler/proto-0x。這是無證的,並在不斷變化。買者自負。 – 2013-02-17 17:55:06

+0

感謝您的建議,但我不能依賴此應用程序的C++ 11可用性。然而,我有一個不同的想法:我一直在閱讀Proto的介紹性文檔,我知道它是Phoenix 3.0的基礎。是否有可能以某種方式使用'proto :: matches <>'元函數來完成我想在編譯時做的事情?似乎這個問題,正如我提出的那樣,如果輸入類型不被支持,根據lambda的語法會產生一個無效的表達式。我可能會離開這裏,但你是專家,所以我想我會問。 – 2013-02-19 03:09:06

相關問題