将功能放入模板中

时间:2013-11-15 14:24:21

标签: c++ class templates

我找到了一个线程池类,我尝试了很多组合来调用带有函数的方法。

以下是我尝试的示例:

WorkerPool wp(4);
wp.run_task<Connection::On_NET1_LOGIN>(&On_NET1_LOGIN());

这是WorkerPool的功能:

 template < typename Task >
  void run_task( Task task )
  {
    boost::unique_lock< boost::mutex > lock( mutex_ );

    // If no threads are available, then return.
    if ( 0 == available_ ) return;

    // Decrement count, indicating thread is no longer available.
    --available_;

    // Post a wrapped task into the queue.
    io_service_.post( boost::bind( &WorkerPool::wrap_task, this,
                                   boost::function< void() >( task ) ) );
  }

private:
  /// @brief Wrap a task so that the available count can be increased once
  ///        the user provided task has completed.
  void wrap_task( boost::function< void() > task )
  {
    // Run the user supplied task.
    try
    {
      task();
    }
    // Suppress all exceptions.
    catch ( ... ) {}

    // Task has finished, so increment count of available threads.
    boost::unique_lock< boost::mutex > lock( mutex_ );
    ++available_;
  }

在调用该线程池的函数时我做错了什么? 感谢。

1 个答案:

答案 0 :(得分:1)

您正尝试添加如下任务:

wp.run_task<Connection::On_NET1_LOGIN>(&On_NET1_LOGIN());

这似乎有两个问题。

  1. 您无需指定模板参数,因为可以推断它们。此外,如果您这样做,则应指定函数的类型 - 而不是名称。
  2. 您想要传递要调用的函数的地址,但是您正在尝试调用该函数并获取结果的地址。
  3. 要解决这两个问题,请尝试以下操作:

    wp.run_task(&Connection::On_NET1_LOGIN);
    

    注意:由于On_NET1_LOGIN似乎是Connection的成员函数,因此除非函数为static,否则无效。如果不是这种情况,则需要Connection实例来调用该函数,并且需要发送一个执行此操作的函数对象。这可以使用lambda或std::bind来解决。