2

QtConcurrent 文档

QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split), ',');
...
QList<QByteArray> result = future.result();

std::tr1::bind上面的代码片段似乎以与( std::bindfor > C++11)类似的方式绑定函数。也就是说,它采用了一个非静态成员函数 ( QByteArray::split()) 并(稍后)在它是其成员的对象的特定实例上调用它(我们已将其提供为bytearray)。

Qt 是如何做到这一点的?它是在使用std::tr1::bind还是boost::bind在幕后的某个地方?

该文档还提到了您将使用std::tr1or的情况boost,但我不完全理解绑定函数在该上下文中的含义。上述情况实际上是否与您可能使用的其他情况不同/更专业/更简单tr1or boost

我试图通过源头找到自己的方式,但我很快就迷路了!

4

3 回答 3

2

我将尝试一个自我回答,因为现有的答案(非常感谢@Mike Brown 和@skyhisi)奠定了基础,但不解决这个具体案例......

从来源:

QtConcurrent::run(...)

template <typename T, typename Class>
QFuture<T> run(const Class &object, T (Class::*fn)())
{
  return (new QT_TYPENAME SelectStoredMemberFunctionCall0<T, Class>::type(fn, object))->start();
}

SelectStoredMemberFunctionCall0

template <typename T, typename Class>
struct SelectStoredMemberFunctionCall0
{
  typedef typename SelectSpecialization<T>::template
    Type<StoredMemberFunctionCall0    <T, Class>,
      VoidStoredMemberFunctionCall0<T, Class> >::type type;
};

VoidStoredMemberFunctionCall0

template <typename T, typename Class>
class VoidStoredMemberFunctionCall0 : public RunFunctionTask<T>
{
public:
  VoidStoredMemberFunctionCall0(T (Class::*_fn)() , const Class &_object)
  : fn(_fn), object(_object){ }

  void runFunctor()
  {
    (object.*fn)();
  }
private:
  T (Class::*fn)();
  Class object;
};

鉴于上述情况,我可以看到 Qt 以正常方式存储指向成员函数的指针,但是通过将其装饰在模板中,否则会被忽视,从而产生了泛型的错觉。

的类型和VoidStoredMemberFunctionCall0::object签名VoidStoredMemberFunctionCall0::fn都在上面传递给的参数中指定QtConcurrent::run

老实说,我不知道这种“隐式”模板化甚至是可能的。有人可以推荐进一步阅读吗?

于 2011-11-16T22:10:19.090 回答
1

C++ FAQ很好地解释了指向成员函数的指针并解释了陷阱。

在某些时候,会有一条类似于:

ret_val = obj_ptr->*func_ptr(param);

但是它将被封装在模板中,以允许传递任何对象类型和参数类型,并且其中也会混杂线程调度。

于 2011-11-16T19:49:57.360 回答
0

您正在传递函数指针和声明函数的类的实例。调用它就像从对象中取消引用函数指针一样简单。这个 StackOverflow 问题显示了答案

于 2011-11-16T17:47:21.130 回答