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



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

由于其他原因,我也感到非常困惑,因为尽管正在使用struct,但它具有类元素;例如,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开头的部分是模板成员函数。换句话说,它是一个函数模板,它是类(在本例中为结构)的成员。

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

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:标记不会完成任何操作)。

相关内容

  • 没有找到相关文章

最新更新