powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как создать такую лямбда- функцию?
3 сообщений из 3, страница 1 из 1
Как создать такую лямбда- функцию?
    #39661448
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я хочу запретить копирование моих объектов, но особенностью объекта std::function является необходимость возможности копирования , что в свою очередь требует необходимость возможности копирования всех "вложенных" объектов. Чтобы обойти обязательность копирования вложенных объектов я создал "странный" конструктор копирования, который по сути перемещает "вложенный" объект (правда для этого надо позволить его изменять):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
class MyLambda
    {
    public:
        mutable MyClass foo;

        MyLambda(const MyLambda& Bind):
            foo(std::move(Bind.foo))
        {}

        MyLambda(MyClass&& foo_):
            foo(std::move(foo_))
        {}

        void operator ()()
        {
            Write(foo);
        }
    };

class MyClass
    {
    public:
        MyClass(){}
        MyClass (const MyClass& Value) = delete; //УДАЛЯЕМ
        MyClass (MyClass&& Value){}
    };

void func(MyClass& foo) 
{
      MyLambda Bind(std::move(foo));
      std::function<void(void)> Bind2(Bind);//НЕТ ОШИБКИ!

        auto Bind3 = [foo = std::move(foo)]
        {
            Write(std::move(foo));
        };
        std::function<void(void)> Bind4(Bind3);//ошибка: use of deleted function ‘{anonymous}::MyClass::MyClass(const {anonymous}::MyClass&)’)!
}



Может есть какой- то культурный способ использовать классические лямбды, а не мое оригинальное изобретение?
...
Рейтинг: 0 / 0
Как создать такую лямбда- функцию?
    #39661504
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил, что мой только перемещаемый объект очень похож на unique_ptr и для проверки написал такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void OpenFile(std::unique_ptr<std::ifstream>&& File, cstring& FileName)
{
    File->open(FileName, std::ios::in);
}

int main(int argc, char *argv[])
{
     std::unique_ptr<std::ifstream> File(new std::ifstream);
     std::function<void(void)> Bind5 = [File = std::move(File)] () mutable ///ошибка: use of deleted function
     {
         std::string FileName;
         OpenFile(std::move(File), FileName);
     };
}



Зато с shares_ptr этот же код отлично работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void OpenFile(std::shared_ptr<std::ifstream>&& File, cstring& FileName)
{
    File->open(FileName, std::ios::in);
}

int main(int argc, char *argv[])
{
     std::shared_ptr<std::ifstream> File(new std::ifstream);
     std::function<void(void)> Bind5 = [File = std::move(File)] () mutable
     {
         std::string FileName;
         OpenFile(std::move(File), FileName);
     };
}



Другими словами вопрос можно перефразировать так: как в лямбдах использовать только перемещаемые объекты, например, unique_ptr?
...
Рейтинг: 0 / 0
Как создать такую лямбда- функцию?
    #39661517
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока решил использовать некрасивое решение и вместо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class MyClass
    {
    public:
        MyClass(){}
        MyClass (const MyClass& Value) = delete; //УДАЛЯЕМ
        MyClass (MyClass&& Value){}
    };



Написать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class MyClass
    {
    public:
        MyClass(){}
        MyClass (const MyClass& Value){throw std::logic_error("Use copy- constuctor of Smart array is denied!");}
        MyClass (MyClass&& Value){}
    };



Так во время компиляции конструктор копирования получается доступным, а во время выполнения при его использовании вылезет ошибка.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как создать такую лямбда- функцию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]