Структура, содержащая необычную шаблонную функцию в коде 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); }
};
}
1 ответ
Часть, которая начинается с 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++ единственная разница между class
а также struct
это видимость члена в class
по умолчанию private
, но в struct
по умолчанию public
(Итак public:
тег ничего не делает в этом случае).