当前位置:  开发笔记 > 编程语言 > 正文

Visual C++"为每个"可移植性

如何解决《VisualC++"为每个"可移植性》经验,为你挑选了5个好方法。

我刚才刚刚发现Visual C++ 2008(也许还有早期的版本?)支持for eachstl列表等语法以促进迭代.例如:

list myList;

for each (Object o in myList)
{
  o.foo();
}


我很高兴发现它,但我担心可怕的一天,当有人决定我需要能够在say,gcc或其他编译器中编译我的代码时的可移植性.这种语法是否得到广泛支持,我可以使用它而不必担心可移植性问题吗?



1> Ferruccio..:

我不会用那个.虽然这是一个诱人的功能,但语法与即将推出的C++ 0x标准不兼容,后者使用:

list myList;

for (Object o : myList)
{
   o.foo();
}


做同样的事情.



2> QuantumPete..:

对于每个都不是标准的C或C++语法.如果您希望能够在gcc或g ++中编译此代码,则需要创建一个迭代器并使用标准for循环.

QuantumPete

[edit]这似乎是MS Visual C++中引入的一个新功能,所以这绝对不是可移植的.参考:http://msdn.microsoft.com/en-us/library/xey702bw%28VS.80%29.aspx [/ edit]



3> Konrad Rudol..:

有一个非常好的便携式替代品:Boost.Foreach.只需将此标头转储到您的项目中,您就可以按如下方式编写循环:

list myList;

BOOST_FOREACH(Object o, myList)
    o.foo();



4> Mike Hordeck..:

如果你想使用foreach并且同时你不想添加额外的依赖(例如Boost) - 这个宏将帮助你:

#define VAR(V,init) __typeof(init) V=(init)
#define FOREACH(I,C) for(VAR(I,(C).begin());I!=(C).end();I++)

std::vector numbers;

FOREACH(I, numbers)
{
    std::cout << *I << std::endl;
}



5> Luc Touraill..:

Visual C++"for each"不是标准的C++,这意味着您将无法在其他编译器(如g ++)上编译代码.但是,STL提出了std :: for_each,但它的语法不太直观.这是它的原型:

template 
UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f);

它需要两个定义有效范围的迭代器,并将一元函数(或仿函数)f应用于此范围内的每个对象.您可以使用std :: for_each重写您的示例,如下所示:

void foo(Object o)
{
  o.foo();
}
...
list myList;

std::for_each(myList.begin(), myList.end(), foo);


但是,如果你想要接近每个构造的经典语法,并且如果你可以使用Boost,你可以使用BOOST.FOREACH,这将让你写

list myList;

BOOST_FOREACH(Object o, myList)
{
    o.foo();
}


注意:对于每个(a中的b),即使在VS 2005/2008中也似乎只是CLR - 你不能在本机代码中使用它,只有在以.NET为目标时,才能使每个"更不便携".否则我认为你的答案非常好.
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有