February 02, 2005
I implements MSC++ keyword __uuid partly with template.
It May be usefull to port ATL and lastest MFC library to DMC++.

The source code.

#include <ole2.h> //for type REFIID ...

template <typename T> struct UUID_Traits;

#define DEFINE_IID_TRAITS(interface) \
template<> struct UUID_Traits<interface>\
{\
static REFIID GetIID()\
{\
return IID_ ## interface;\
}\
};

DEFINE_IID_TRAITS(IUnknown)
DEFINE_IID_TRAITS(IDispatch)

template <typename T> inline
REFIID uuidof(T&)
{
return UUID_Traits<T>::GetIID();
}

template <typename T> inline
REFIID uuidof(T*)
{
return UUID_Traits<T>::GetIID();
}

//-0------testing------0-

#include <stdio.h>

void print_iid(REFIID riid)
{
LPOLESTR test;
StringFromCLSID(riid, &test);
printf("%ws\n", test);
CoTaskMemFree(test);
}

int main()
{
CoInitialize(0);
IDispatch* p1;
IUnknown& p = *p1;

print_iid(uuidof(p));
print_iid(uuidof(p1));

CoUninitialize();
}


February 02, 2005
COMSTL has had this for several years, in the form of its IID_traits<> class template, where it forms an integral part of the interface_cast<> mechanisms. It also resolves to using __uuidof on compilers that support it. See comstl_interface_cast.h, comstl_interface_traits.h & comstl_interface_traits_std.h

The full technique's explained in detail in Chapter 19 of my book, Imperfect C++ (http://www.awprofessional.com/titles/0321228774/).

Cheers

Matthew Wilson

Author: "Imperfect C++", Addison-Wesley, 2004
    (http://www.imperfectcplusplus.com)
Contributing editor, C/C++ Users Journal
    (http://www.synesis.com.au/articles.html#columns)
STLSoft moderator
    (http://www.stlsoft.org)

-------------------------------------------------------------------------------

"So far, C++ is the best language I've discovered to say what I want to say" -- Alex Stepanov

-------------------------------------------------------------------------------




<nyra@sohu.com> wrote in message news:ctpu8p$2bqr$1@digitaldaemon.com...
>I implements MSC++ keyword __uuid partly with template.
> It May be usefull to port ATL and lastest MFC library to DMC++.
>
> The source code.
>
> #include <ole2.h> //for type REFIID ...
>
> template <typename T> struct UUID_Traits;
>
> #define DEFINE_IID_TRAITS(interface) \
> template<> struct UUID_Traits<interface>\
> {\
> static REFIID GetIID()\
> {\
> return IID_ ## interface;\
> }\
> };
>
> DEFINE_IID_TRAITS(IUnknown)
> DEFINE_IID_TRAITS(IDispatch)
>
> template <typename T> inline
> REFIID uuidof(T&)
> {
> return UUID_Traits<T>::GetIID();
> }
>
> template <typename T> inline
> REFIID uuidof(T*)
> {
> return UUID_Traits<T>::GetIID();
> }
>
> //-0------testing------0-
>
> #include <stdio.h>
>
> void print_iid(REFIID riid)
> {
> LPOLESTR test;
> StringFromCLSID(riid, &test);
> printf("%ws\n", test);
> CoTaskMemFree(test);
> }
>
> int main()
> {
> CoInitialize(0);
> IDispatch* p1;
> IUnknown& p = *p1;
>
> print_iid(uuidof(p));
> print_iid(uuidof(p1));
>
> CoUninitialize();
> }
>
>