我大学的新学期开始了,我再一次“被迫”退出抽象,并在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)
时
我的问题是:有没有任何工具|技术|语言构造|元编程的东西,可以带来一些c ++代码而不用实际编写它?我需要整个来源,但它最终可能会被混淆,只有机器才能处理它
请不要指责我懒惰,我认为这是我最好的美德之一。 :-)
GWT
的内容,而是将Java
来源编译为JavaScript
来源它会汇编Scala
或Haskell
或F#
到C++
来源,但由于我不相信这样的东西存在,我想有一些东西......有帮助的我很欣赏建议的anon函数,例如。
答案 0 :(得分:3)
你真正要求的并不完全清楚,但如果你正在尝试编写更像你的其他代码的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(在这种情况下,您的代码将更接近您给出的示例)。
答案 1 :(得分:3)
bool is_even = std::find_if(arr.begin(), arr.end(), [](int i) { return i%2 != 0; }) == arr.end();
答案 2 :(得分:2)
使用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
。
答案 3 :(得分:1)
看看Boost.Phoenix库,它使您能够在C ++中编写函数式函数样式(。)。