2012-05-07 24 views
2

我可以创建restrict(amp)功能如下:限制(安培)功能类型

auto f = [](int& item) restrict(amp) {item += 1;}; 

,我还可以在其他restrict(amp)功能使用该功能,例如:

concurrency::parallel_for_each(av.extent, 
    [=](concurrency::index<1> idx) restrict(amp) 
    { 
     f(av[idx]); 
    } 
); 

什么而不是取代的类型编译后的“auto”?我试图使用“std :: function”:

std::function<void (int&) restrict(amp)> f 
      = [](int& item) restrict(amp) {item += 1;}; 

但收到编译错误。

感谢您的关注!

+0

在'std :: function'的模板参数中,函数类型似乎有问题。你尝试过:'std :: function f = ...'? – dirkgently

+0

它不起作用。突出智能感知错误。 – Milovidov

+1

我对MSVC并不熟悉,但我之前听说编译器,编译器前端和IDE/Intellisense都是独立的,不是很兼容的产品,所以有人可能会抱怨其他的东西接受。买者自负。 –

回答

5

lambda表达式的结果是一个闭包对象,并且闭包对象的类型是不可知的。您只能只有使用auto来声明其确切类型的变量。

但是,可以转换闭合对象到std::function的合适实例,并且如果是的λ非捕获,甚至可以将其转换为一个函数指针。但是,这种转换可能会带来(显着)成本,所以您应该尽可能使用auto来处理实际的封闭类型。

这同样适用于bind表达式。

的相关标准节5.1.2(3):

的类型λ-表达的(也是封闭的对象的类型)是一个独特的,无名不愈合类类型 - 称为封闭类型 - 其属性如下所述。这个类的类型不是聚合。

这就是说,我不知道特殊AMP扩展在这种情况下如何表现,这是可以想象的AMP-lambda表达式的限制是不换股到别的。我会试着在AMP规范中查看这个。

更新:AMP Specification的第2.2.3和2.3节似乎适用于此问题。

+0

谢谢!但是,我需要一个代码示例,我可以如何转换。 – Milovidov

+0

@Milovidov:我明白了,对不起。我不得不咨询AMP规范(顺便提一下,这是免费提供的)。 –

+0

好的!我想用C++模板解决这个问题。 – Milovidov