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

405
30 января 2018, 10:44

Имеется класс 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 локальное лямбда-выражение не допускается в функции-члене класса управляемый

Answer 1

Да, это так. Лямбды компилируются как нативный локальный класс/структура, а такого не может быть внутри управляемого класса.

Поэтому придётся вынести нужный метод наружу:

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); }
};
READ ALSO
Почему при команде delete[] выходит ошибка?

Почему при команде delete[] выходит ошибка?

Пожалуйста, объясните что не так

193
с++ детект и закрытие процессов [требует правки]

с++ детект и закрытие процессов [требует правки]

Нужно написать dll которая будет детектить процессы по имени окна и классамИ закрывать приложение в которое она подключена после детекта...

196
Дано радиус круга и сторона квадрата. Сравнить периметр указанных фигур на с++ [требует правки]

Дано радиус круга и сторона квадрата. Сравнить периметр указанных фигур на с++ [требует правки]

Мне нужна программа на с++ Дано радиус круга и сторона квадратаСравнить периметр указанных фигур Желательно скрин кода программы

218