Структура, содержащая необычную шаблонную функцию в коде 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: тег ничего не делает в этом случае).

Другие вопросы по тегам