我将尝试一个自我回答,因为现有的答案(非常感谢@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
。
老实说,我不知道这种“隐式”模板化甚至是可能的。有人可以推荐进一步阅读吗?