我已經在Clojure(一種函數式語言)編程了一段時間,而且我必須使用C++作爲一個類。我一直在嘗試使用我在Clojure中享受過的一些功能(例如,高階函數,lambdas,參數線程,動態類型等),但我遇到了一些困難。如果函數參數內的語句;分支類型
你可以在Clojure中做的一件事(我假設其他函數式語言)幾乎在任何地方使用任何函數。例如,Clojure中的if
語句可以插入到函數調用的參數/參數中,但在C++中,這是不可能的。
由於大的東西我做一個簡單的例子,我試圖讓下面的工作:
println(if (true) { 100 } else { 200 });
我實現的功能println
接受任何數量的參數;它的工作方式與Clojure的println
(與Java的System.out.println
類似),但使用cout
。
顯然,if
語句的語法可能是每個分支必須在後面有一個分號(禁止沒有括號的較短語法替代)。所以我添加了分號並將其放入函數println
中,但這不起作用 - 編譯器拋出了一個expected expression
錯誤。
所以我轉向宏。起初,我實現了這一點:
#define if1(pred, expr_true, expr_false) \
if (pred) { \
return expr_true; \
} else { \
return expr_false; \
}
,我把它放在println
像這樣:
println(if1(true, 100, 200));
但導致該編譯器拋出了同樣的錯誤。
所以我想,也許我可以在一個lambda包裹if
聲明(因爲在C++中,函數不能在函數調用的參數中聲明):
#define if2(pred, expr_true, expr_false) \
[]() -> decltype(auto){ \
if (pred) { return expr_true; } \
else { return expr_false; }}()
我用它像這樣:
println(if2(true, 100, 200));
這一次,顯然編譯器不再關注在一個奇怪的地方if
說法是,它編譯罰款和打印的期望值,100
。
然而,當我試圖println(if2(true, "true!", 200))
,編譯器生成以下錯誤:
error: 'decltype(auto)' in return type deduced as 'int' here but deduced as 'char const (&)[5]' in earlier return statement
如何解決這個錯誤得到什麼?
另外,一般來說,如果decltype(auto)
在這些情況下似乎不起作用,我該如何根據分支條件語句的不同可能返回類型來聲明返回類型?
謝謝你的幫助!
注意:我使用g ++的參數-Wall -Wextra -pedantic -std=c++1y
。
在C++中,你可以使用'condition? if_true:if_false'表達式,如果condition爲true則計算爲'if_true',否則爲'if_false'。那是你的追求? – cdhowie 2014-08-31 03:20:21