std::thread запуск методов из других классов

Модератор: Модераторы разделов

Аватара пользователя
AlphaGh0St
Сообщения: 41

std::thread запуск методов из других классов

Сообщение AlphaGh0St »

Всем привет!
Возникла проблемка.
Подскажите, как запустить в потоке (std::thread) из одного класса метод другого класса?
Например, есть два класса:

Код: Выделить всё

class TestOutput
{
public:
    const char* get() const { return "It's working!\n"; }
};

class CppThread
{
public:
    void start(/* нужно принимать указатель на функцию (метод) и аргументы */)
    {
        // тут нужно запустить поток std::thread(метод, аргументы);
    }
};

Суть в том, чтобы обращаться к std::thread не на прямую (std::thread(класс::метод, аргументы)), а через "обёртку", в данном примере класс CppThread. Например, так:

Код: Выделить всё

TestOutput  to;
CppThread cp;

cp.start(&to::get, this);

И класс CppThread, используя std::thread должен запустить метод get() в новом потоке.

Пробовал описать метод start(), как шаблонный:

Код: Выделить всё

template< class Function, class... Args >
void start(Function&& f, Args&&... args)
{
    std::thread(f, args);
}


Компилятор ругается:
error: parameter packs not expanded with '...'
note: 'args'


Версия GCC 4.7.2.
Если кто знает, как решить эту проблемку, подскажите, пожалуйста.
Благодарю.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: std::thread запуск методов из других классов

Сообщение Alxn1 »

Я думаю, то как-то так:

Код: Выделить всё

#include <functional>

...

class CppThread
{
public:
    void start(const std::function< void () > &fn)
    {
       std::thread(fn); // или как там оно
    }
};

...

TestOutput  to;
CppThread cp;

cp.start(std::bind(&TestOutput::get, &to));


Только с синтаксисом я мог намудрить - пишу по памяти.
Спасибо сказали: