【问题标题】:How to store parameter pack as members如何将参数包存储为成员
【发布时间】:2015-10-31 11:41:25
【问题描述】:

所以我正在阅读这个帖子:C++ How to store a parameter pack as a variable

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

我要创建的是一个带有参数的 Thread 类,我目前的做法是,参数需要能够存储为成员,以便将它们传递给成员函数。

这是我当前的 Thread 类:(我希望所有 FuncArgs 都能够作为成员存储,因此可以将它们传递给 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;
    }

};

【问题讨论】:

标签: c++ visual-c++


【解决方案1】:

我假设您这样做是出于教育目的 - 因为否则,我强烈建议您停止重新发明轮子并按照自然的意图使用 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();
};

【讨论】:

  • 是的,它主要用于教育目的和学习,我喜欢学习新事物和大量实验!我会试试这个谢谢! =]
  • std::forward 带来了奇怪的错误(我知道我应该使用它,我已经在我的其他框架部分中使用过它),但在这里它给出了奇怪的转换错误...... template&lt;typename _Ty, typename...Args&gt; YVoid Start(_Ty* object, YVoid(_Ty::* method)(Args...), Args...args) { _myFunction = [=]() { (object-&gt;*method) (std::forward&lt;Args&gt;(args)...); };
  • 我也喜欢the experimenting alot。无论如何,您忘记提及错误的文本。我的水晶球最近多云,我很难从你的显示器上看出来。
  • 错误:puu.sh/l403X/324afb43d9.png 更清晰的代码:puu.sh/l404S/1b32d1d718.png 正在测试的代码:puu.sh/l406z/5966354e43.png(Ctor 调用 Start,没有 std::forward 也能正常工作)
  • Start 应该取Args&amp;&amp;...args(注意和符号)
猜你喜欢
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2011-12-07
  • 2015-02-26
相关资源
最近更新 更多