如何将参数包存储为成员

How to store parameter pack as members

本文关键字:存储 成员 参数 包存储      更新时间:2023-10-16

所以我读了这个线程:C++如何将参数包存储为变量

这个答案并没有真正帮助我(我不确定如何实现它)

我试图创建的是一个有参数的Thread类,按照我目前的做法,参数需要能够存储为成员,以便传递到成员函数中。

这是我当前的Thread类:(我希望所有的FuncArg都能存储为成员,这样它们就可以传递给Run中的成员函数)

template<class _Ty, typename...FuncArgs>
    class YThread
{
private:
    typedef YVoid(_Ty::* YMethod)();
    HANDLE _myThread_handle;
    DWORD  _myThread_id;
    _Ty* _myObject;
    YMethod _myMethod;

private:
    static YVoid Run(YPointer thread_obj)
    {
        YThread<_Ty>* thread = (YThread<_Ty>*)thread_obj;
        thread->_myObject->*thread->_myMethod();
    }
    YThread(const YThread<_Ty>& Other) = delete;
    YThread<_Ty>& operator=(const YThread<_Ty>& other) = delete;
public: // Starters
    YThread()
    {}
    YThread(_Ty* object, YVoid(_Ty::* method)())
    {
        _myObject = object;
        _myMethod = method;
        Start();
    }
    ~YThread()
    {
        if (_myThread_handle)
            CloseHandle(_myThread_handle);
    }
    YBool Start()
    {
        _myThread_handle = CreateThread(
            0, 0,
            (LPTHREAD_START_ROUTINE)YThread<_Ty>::Run,
            this,
            0, &_myThread_id);
    }
    YBool Start(_Ty* object, YVoid(_Ty::* method)())
    {
        _myObject = object;
        _myMethod = method;
        Start();
    }
public: // Other
    YVoid Kill()
    {
        TerminateThread(_myThread_handle, 0);
    }
    YVoid Join()
    {
        WaitForSingleObject(_myThread_handle, INFINITE);
    }
    YBool is_alive()
    {
        DWORD exitCode = 0;
        if (_myThread_handle)
            GetExitCodeThread(_myThread_handle, &exitCode);
        if (exitCode == STILL_ACTIVE)
            return true;
        return false;
    }
};

我认为你这样做是出于教育目的——否则,我强烈建议你停止重新发明轮子,按照自然的意图使用std::thread

话虽如此,也许是这样的:

class YThread {
  std::function<void()> thing_to_run;
public:
  template<class Ty, typename... FuncArgs>
  YThread(Ty* object, YVoid(Ty::* method)(FuncArgs...),
          FuncArgs&&... args) {
    thing_to_run = [=](){ (object->*method)(std::forward<FuncArgs>(args)...); };
  }
  // When it comes time to actually run the method, just do
  //   thing_to_run();
};