Visual C++ 2010 new features 新特性简介


http://msdn.microsoft.com/en-us/library/dd465215%28VS.100%29.aspx

可以看到VC2010有以下变化:

1)MFC部分增加了CTaskDialog,这个应该是windows7的样式,在toplanguage上有人唱衰MFC,不过个人认为MFC与VC++应该是同生共存的关系。

image

2)Lambda Expressions in C++

这个对于VC++来说算是个有意思的东西,尽管大部分的解释型语言(如ruby,python,lua)都有lambda的支持。

3)static_assert

这个东西在boost也有实现,就是boost::static_assert。简单说就是让assert功能在编译时就可以工作,如果出现错误,可以在编译过程中输出错误结果。

有一些讨论可以参考这里

 

在这里想多说两句lambda,比较一下vc++与lua的实现。lambda可以粗略认为是一个匿名函数,由于c++不支持嵌套函数,所以lambda实现是这样的:

// even_lambda.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() 
{
   vector<int> v;
   for (int i = 0; i < 10; ++i) 
   {
      v.push_back(i);
   }

   int evenCount = 0;
   // 加色标粗部分就是lambda,实现功能是对于传入的数字进行奇偶判断。
   for_each(v.begin(), v.end(), [&evenCount] (int n) {
      cout << n;
      if (n % 2 == 0) 
      {
         cout << " is even " << endl;
         evenCount++;
      }
      else 
      {
         cout << " is odd " << endl;
      }
   });

   cout << "There are " << evenCount << " even numbers in the vector." << endl;
}
// 另外一个例子,定义了一个function对象
// compile with: /EHsc
#include <iostream>
#include <functional>
int main()
{
   using namespace std;
   using namespace std::tr1;

   int i = 3;
   int j = 5;
   // 函数声明部分。在这里需要注意的是j是传引用,而i是传值,所以lambda会保存一份i的拷贝
   function<int (void)> f = [=, &j] { return i + j; };
   // Change the values of i and j.
   i = 22;
   j = 44;
   // 当我们调用f的时候,lambda中的i没有随着本地变量的变化而变化,依然是3.
   cout << f() << endl;
   // 最终打印结果为47
}
 
我们使用lua来模拟一下就是这样的

local i, j = 3, 5
local function func_(j)
  local i = i
  return function(j)
    return i+j
  end
end

local f= func_()
i, j = 22, 44
print(f(j))

这里使用了尾调用来实现对于局部变量i的缓存,我原来以为lua是会保存一份i的值,可惜我的想法是不对的,嘿嘿。
对于lua来说,i和j的捕获应该是在第二次对ij赋值以后,python好像也是如此,大家可以试试下面的python代码。

i = 2
j = 3
def f (x):
    return i + x

i = 22
j = 44
print(f (j))

结果就是66.

关于lambda,大家可以参看这篇文字:
http://blog.csdn.net/hikaliv/archive/2009/09/08/4532958.aspx
或者直接看原文
 
 
 


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注