Pull to refresh
8
0
Сергеев Сергей @codeoneclick

User

Send message
Отличная статья! Подобраны, довольно часто встречающиеся, и жизненые примеры «плохого кода». Сам давно стараюсь пользоваться принципами «программирования от абстракции», а не «от реализации».
Довольно интерессное предложение. Но насколько я понял, избежать работы с variadic templates не получится. Возможно я что-то не так понял, но вот по быстрому набросал реализацию:

std::queue<std::packaged_task<void()>> queue;

template<class FUNCTION, class ...ARGS>
std::future<typename std::result_of<FUNCTION(ARGS...)>::type>
dispatch(FUNCTION &&f, ARGS &&...args) {
    std::packaged_task<typename std::result_of<FUNCTION(ARGS...)>::type()> task(std::bind(f,args...));
    auto future = task.get_future();
    queue.push(std::packaged_task<void()>(std::move(task)));
    return future;
}

std::function<void(int, float, std::string)> function = [](int a, float b, const std::string& c)
{
      EXPECT_TRUE(a == 1 && b == 2.0f && c == "Hello World");
};
    
auto future = dispatch(std::move(function), 1, 2.0f, "Hello World");
queue.back()();


Поправьте меня, если я не прав :-)
Если повнимательней присмотреться, то можно понять, что предложенный вами вариант будет работать без каких либо изменений.

class Clazz
{
    
public:
    
    std::string m_value;
    
    void Foo(int a, float b, const std::string& c)
    {
        std::cout<<a<<b<<c<<std::endl;
    };
};

typedef std::function<void(void)> task_t;

TEST(gcdppLib, Dispatch_05)
{
    std::shared_ptr<Clazz> clazz = std::make_shared<Clazz>();
    task_t task = std::bind(&Clazz::Foo, clazz, 1, 2.0f, "Hello World");
    gcdpp::gcdpp_dispatch_async(gcdpp::gcdpp_dispatch_get_global_queue(gcdpp::GCDPP_DISPATCH_QUEUE_PRIORITY_HIGH), task);
}


Но все равно спасибо за замечание, так как без вас вряд бы проверил такой вариант. ;-)

Information

Rating
Does not participate
Location
Харьков, Харьковская обл., Украина
Date of birth
Registered
Activity