запуск лямбда-функции внутри рабочего потока в Касабланке - PullRequest
0 голосов
/ 28 мая 2019

Как передать аргумент лямбда-функции с помощью Casablanca pplx::task?

Без Касабланки:

auto f = [](int x) {
    cout <<"Hello "<<x<<endl;
    return 5;
};
f(4);

С Касабланкой,

auto g = [](/*argument x*/ ??) {
    cout <<"Hello "<<x<<endl;
    return 5;
};


pplx::task<int>(f(/*pass argument ?? */))
.then([](pplx::task<int> prevTask)
{
    int res;
    try {
        res = prevTask.get();
    }catch(const std::exception &e) {
        cout << e.what() << endl;
    }
}).wait();

Я пытался передать простое int значение pplx::task<int>(g(3)), но оно не компилируется.

Код:

#include <cpprest/asyncrt_utils.h>
using namespace std;
using namespace utility;
int main() {
    auto f = [](int x) {
        std::cout <<"Hello "<<x<<std::endl;
        return 5;
    };
    f(4);

    #if 0 // does not work
    auto g = [](int x) {
        cout <<"Hello "<<x<<endl;
        return 5;
    };
    pplx::task<int>(g(3))
    .then([](pplx::task<int> prevTask)
    {
        int res;
        try {
            res = prevTask.get();
        }catch(const std::exception &e) {
            cout << e.what() << endl;
        }
    }).wait();
    #endif
}

CMakeLists.txt:

cmake_minimum_required (VERSION 3.5)
set(CMAKE_BUILD_TYPE Debug)
project(TEST)

message(STATUS "Compiling TestFile : ${PROJECT_NAME}")
set (CMAKE_CXX_STANDARD 17)
message(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")

set (CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

add_executable(${PROJECT_NAME} test.cpp)

set(REST_LIBRARIES "-lcpprest")
set(CMAKE_CXX_FLAGS "-std=c++17 -Wall -g -fsanitize=address")

target_link_libraries(${PROJECT_NAME} ${REST_LIBRARIES})

Требуется установка в Ubuntu libcpprest-dev

Обновление: работает со следующим синтаксисом:

#include "cpprest/asyncrt_utils.h"
using namespace std;
using namespace utility;
int main() {

    auto g = [](std::string x) {
        cout<<x;
        return std::string(" World!");
    };

    pplx::task_from_result<std::string>("Hello")
    .then([g](std::string x)
    {   
        auto ret = g(x);
        return ret;
    })
    .then([](pplx::task<std::string> prevTask)
    {
        cout << prevTask.get() <<endl;

    }).wait();
}

Нужно ли использовать task_from_result?

...