Страницы

Поиск по вопросам

понедельник, 20 мая 2019 г.

Лямбда-выражения и управляемый код

Имеется класс C++, написанный с применением управляемого кода. И вот нелегкая привела меня вызвать в данном классе в одном из методов любой из std::algorithm. Так вот, студия любезно указала, что лямбда - выражения использовать нельзя. Пришлось написать класс, и сделать его функтором. Так вот вопрос - почему запрещены лямбды?
Код:
public ref class edit_base { public: void test() { std::string line("abcdefg"); std::string lineNew; std::copy_if(line.begin(), line.end(), std::back_inserter(lineNew), [](const char& s) { if (s > 10 && s < 100) return true; return false; }); } }
Пишу через 17 студию. Компилятор: 19.11.25547
Error: E2093 локальное лямбда-выражение не допускается в функции-члене класса управляемый


Ответ

Да, это так. Лямбды компилируются как нативный локальный класс/структура, а такого не может быть внутри управляемого класса.
Поэтому придётся вынести нужный метод наружу:
ref class edit_base;
void test(edit_base^ self) { // тут можно обращаться к полям класса (если надо, объявите эту функцию friend'ом) std::string line("abcdefg"); std::string lineNew; std::copy_if(line.begin(), line.end(), std::back_inserter(lineNew), [](const char& s) { if (s > 10 && s < 100) return true; return false; }); }
public ref class edit_base { public: void test() { ::test(this); } };

Комментариев нет:

Отправить комментарий