Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как создать такую лямбда- функцию? / 3 сообщений из 3, страница 1 из 1
15.06.2018, 19:16
    #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
16.06.2018, 08:50
    #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
16.06.2018, 09:53
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как создать такую лямбда- функцию? / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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