元程序c ++代码

时间:2011-02-24 20:23:23

标签: c++ functional-programming metaprogramming

我大学的新学期开始了,我再一次“被迫”退出抽象,并在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来源它会汇编ScalaHaskellF#C++来源,但由于我不相信这样的东西存在,我想有一些东西......有帮助的我很欣赏建议的anon函数,例如。

4 个答案:

答案 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 ++中编写函数式函数样式(。)。