тип функции ограничения (усилителя)

Я могу создать функцию 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;};

но получил ошибку компиляции.

Спасибо за Ваше внимание!


person synacker    schedule 07.05.2012    source источник
comment
Кажется, возникла проблема с типом функции в аргументе шаблона std::function. Вы пробовали: std::function<void (*)(int&)restrict(amp)> f = ...?   -  person dirkgently    schedule 07.05.2012
comment
Это не работает. Выделяет ошибку IntelliSense.   -  person synacker    schedule 07.05.2012
comment
Я не знаком с MSVC, но слышал раньше, что компилятор, внешний интерфейс компилятора и IDE/Intellisense — это отдельные, не совсем совместимые продукты, и поэтому возможно, что один жалуется на то, что другой принимает. . Пусть покупатель будет бдителен.   -  person Kerrek SB    schedule 07.05.2012
comment
Да, я согласен, но также существует ошибка компиляции.   -  person synacker    schedule 07.05.2012
comment
Вы можете попробовать только std::function<void (int&)> или void(*)(int&)?   -  person Kerrek SB    schedule 07.05.2012


Ответы (1)


Результатом лямбда-выражения является объект замыкания, а тип объекта замыкания неизвестен. Вы можете только использовать auto для объявления переменной точного типа.

Однако вы можете преобразовать объект замыкания в подходящий экземпляр std::function, а если лямбда не захватывает, вы даже можете преобразовать его в указатель на функцию. Однако это преобразование может потребовать (значительных) затрат, поэтому вам следует как можно чаще использовать auto для обработки фактического типа замыкания.

То же самое касается bind выражений.

Соответствующий стандартный раздел 5.1.2(3):

Тип лямбда-выражения (который также является типом объекта замыкания) — это уникальный безымянный тип класса без объединения, называемый типом замыкания, свойства которого описаны ниже. Этот тип класса не является агрегатом.

Тем не менее, я не уверен, как специальные расширения AMP ведут себя в этом контексте, и вполне возможно, что лямбда-выражения, ограниченные AMP, не преобразуются во что-либо другое. Я попытаюсь найти это в спецификации AMP.

Обновление: разделы 2.2.3 и 2.3 Спецификация AMP, похоже, применима к этому вопросу.

person Kerrek SB    schedule 07.05.2012
comment
@Milovidov: Понятно, извини за это. Я должен был бы проконсультироваться со спецификацией AMP (которая, кстати, находится в свободном доступе). - person Kerrek SB; 07.05.2012