Вы также можете использовать шаблоны (черты), если вам нужно статически «прикрепить» guid к интерфейсу. Рассмотрим:
В обычном h-файле вы создаете пустой неспециализированный шаблон:
template<typename TInterface> struct TInterfaceTraits {}
При определении вашего интерфейса напишите для него специализацию шаблона (или вы можете написать его в любом другом месте, в том числе непосредственно перед использованием):
class ICalculator : public IUnknown
{
//...
};
template<> struct TInterfaceTraits<class ICalculator > {
static GUID guid() {
return IID_ICalculator ;
}
};
Тогда, чтобы получить его, вы можете написать что-то вроде:
ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);
Конечно, вы можете написать (я оставляю это вам) шаблонную оболочку для QueryInterface, которая будет использовать черты для автоматического предоставления правильного guid, и это будет еще проще в использовании, т.е.
ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);