[英]metaprogram c++ code
我大學的新學期開始了,我再一次“被迫”退出抽象,探索c++
中低級編程的深層次。 我的思緒已經部分地受到折疊,高階函數等的影響,我在寫作中沒有任何樂趣,例如:
bool allEven = true;
for(int i = 0; i < arr.length; i++){
if (arr[i] % 2 != 0){
allEven = false;
break;
}
}
當我知道我可以寫val allEven = arr forall (_ % 2 == 0)
。
GWT
這樣的東西,而是將Java
源碼編譯成JavaScript
源碼它會將Scala
或Haskell
或F#
編譯成C++
源代碼,但是因為我沒有相信這樣的事情存在,我想有一些東西......樂於助人。
例如,我很欣賞建議的anon函數。
現在還不完全清楚你真正要求的是什么,但是如果你正在嘗試編寫更像你的其他代碼的C ++,你可以這樣做:
bool allEven =
std::accumulate(arr.begin(), arr.end(), [](bool a, int i) {return a && i & 1==0; }, 1);
這確實使用了lambda,它是C ++ 0x中的新增功能。 如果您使用的是不支持lambda的舊編譯器,則可以考慮使用Boost Lambda(在這種情況下,您的代碼將更接近您給出的示例)。
bool is_even = std::find_if(arr.begin(), arr.end(), [](int i) { return i%2 != 0; }) == arr.end();
使用C ++ 0x中的新算法,有all_of
:
bool all_even = std::all_of(arr.begin(), arr.end(),
[](int i) { return i%2 == 0; });
Boost.Range允許更少的冗長:
bool all_even =
0==boost::count_if(arr, [](int i){ return i%2 != 0;});
希望Boost.Range很快能提供all_of
。
看一下Boost.Phoenix庫,它使您能夠在C ++中編寫close(er)函數式編程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.