Runnable 函数的 C++ 模板

C++ template for Runnable function

我正在为我的应用程序使用 C++ 编写一个线程管理库,作为其中的一部分,我正在尝试编写一个模板 class,它需要 FunctionPointer 在 运行函数。我是一名 Java 开发人员,并尝试如下可视化:

class MyRunnable : public Runnable {

    public:
        MyRunnable(fp)
        {
            mFp = fp;
        }

    private:

    FunctionPointer mFp;

    // Will be called by the thread pool using a thread
    void run() 
    {
         mFp();
    }

}

class ThreadManager {

    public:
        void execute(MyRunnable runnable) {
            executeOnAThreadPool(runnable);
        }

}

由于我不精通 C++ 语法,我发现很难将构造函数定义为采用 FunctionPointer 作为参数,FunctionPointer 的参数数量可变。类似于:

MyRunnable(Fp fp, Args... args)

谁能帮我定义上面 MyRunnable class 的构造函数。 谢谢。

不确定...但在我看来,您看起来像

class MyRunnable
 {
   private:
      std::function<void()> mF;

   public:       
      template <typename F, typename ... Args>
      MyRunnable (F && f, Args && ... args)
       : mF{ [&f, &args...](){ std::forward<F>(f)(std::forward<Args>(args)...); } }
       { }

      void run ()
       { mF(); }
 };

下面是一个完整的编译示例

#include <iostream>
#include <functional>

class MyRunnable
 {
   private:
      std::function<void()> mF;

   public:       
      template <typename F, typename ... Args>
      MyRunnable (F && f, Args && ... args)
       : mF{ [&f, &args...](){ std::forward<F>(f)(std::forward<Args>(args)...); } }
       { }

      void run ()
       { mF(); }
 };

void foo (int a, long b, std::string const & c)
 { std::cout << "executing foo() with " << a << ", " << b << ", " << c << '\n'; }

int main ()
 {
   MyRunnable  mr{foo, 1, 2l, "three"};

   std::cout << "before run" << '\n';

   mr.run();

 }

打印

before run
executing foo() with 1, 2, three