On 04/20/2012 03:23 PM, Martin Drasar wrote:
Hi,

I am migrating a C++ project to D and I have hit a roadblock that I hope
you might help me with.

My code is heavily inspired by the COM architecture, so I have naturally
take a look at std/c/windows/com.d, just to find out that it does not
contain all I need.

In the C++ code I have several interfaces and a class. The class
inherits from these interfaces, exposes some of them and it is possible
to get one interface from another using the QueryInterface function by
supplying correct GUID:

class C : IA, IB, IC
{
   EXPOSE_INTERFACE(IA, IC);
   ...
}

where EXPOSE_INTERFACE is macro that expands to something like this:

void QueryInterface (IComponent** comp, GUID* guid)
{
   ...
   if (guid == IAGuid) *comp = ...some casting
   if (guid == IBGuid) *comp = ...some casting
   ...
}

So I was thinking that in D I could use mixin templates with variadic
arguments, so I tried something like that:

string interfaceGuid(string ifaceName)
{
   return ifaceName ~ "Guid";
}

mixin template EXPOSE_INTERFACE(string ifaceName)
{
   if (mixin(interfaceGuid(ifaceName)) == guid) { ... some casting }
}

mixin template EXPOSE_INTERFACES(T...)(T args)
{
   void QueryInterface(ref IComponent comp, string guid)
   {
     foreach (arg; args)
     {
       mixin EXPOSE_INTERFACE!arg;
     }
   }
}

But I got this:

component.d(8): Declaration expected, not 'if'
component.d(15): no identifier for declarator args
component.d(15): semicolon expected, not ')'
component.d(15): Declaration expected, not ')'
component.d(19): unrecognized declaration

Then I got confused and realized that my D is as sharp as is my German -
studied it for some time, but still has a problem to order a bread in a
store...

My questions are following:
- can mixin templates be used this way?

They can only mixin declarations.

- why are they complaining?

Because if is a statement and not a declaration.

- is there a better way to do this other than reproducing C macros?


Inline EXPOSE_INTERFACE into EXPOSE_INTERFACES and it'll work.

Reply via email to