在 C++ 代码中包含异常模板函数的结构

Struct containing unusual templated function in C++ code

在下面的 C++ 代码中(来自 Microsoft COM 头文件),以 template<class Q>... 开头的部分是什么?

由于其他原因我也很困惑,因为虽然使用了 struct,但它有类似 class 的元素;例如,public 关键字。

extern "C++" {
    struct IUnknown {
    public:
        virtual HRESULT WINAPI QueryInterface(REFIID riid,void **ppvObject) = 0;
        virtual ULONG WINAPI AddRef(void) = 0;
        virtual ULONG WINAPI Release(void) = 0;
        template<class Q> HRESULT WINAPI QueryInterface(Q **pp) { return QueryInterface(__uuidof(*pp),(void **)pp); }
    };
  }

template<class Q> HRESULT WINAPI QueryInterface开头的部分是模板成员函数。换句话说,它是一个函数模板,它是 class(或结构,在本例中)的成员。

作为模板意味着您可以将任何接口类型作为其参数传递,编译器将生成一个函数来查询对象以获取该类型的接口:

IFoo *x;
IBar *y;

if (foo.QueryInterface(&x) != S_OK) {
    // use x->whatever to invoke members of IFoo
}

if (foo.QueryInterface(&y) != S_OK) {
    // use y->whatever to invoke members of IBar
}

由于它是一个函数模板,编译器会根据您传递的参数类型推导出 Q 的类型,因此当您传递 IFoo ** 时,Q 的类型为 IFoo,当您传递 IBar ** 时,Q 的类型为 IBar.

在 C++ 中,classstruct 之间的唯一区别是 class 中的成员可见性默认为 private,但 struct ] 默认为 public(所以 public: 标签在这种情况下没有完成任何事情)。