www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - mixin template as virtual function with variadic params not working

reply Derek Ney <derek hipgraphics.com> writes:
I am trying to create a set of methods that take a variable number of arguments
(at compile time). I would have liked to have used template functions to do
that, but I need the functions to be virtual, and template functions cannot be
virtual. So I thought I would try to use a mixin of a variadic template
function. But I am getting a weird compiler error with my simple test program.
Here is the test program:

     1  import std.stdio;
     2
     3  template TCALL(ARGS...)
     4  {
     5    void makecall(ARGS args)
     6    {
     7      writefln("tcall...", args);
     8    }
     9  }
    10
    11  mixin TCALL!();
    12  mixin TCALL!(int);
    13  mixin TCALL!(int,int);
    14
    15
    16  class Method
    17  {
    18    mixin TCALL!();
    19    mixin TCALL!(int);
    20    mixin TCALL!(int,int);
    21  }
    22
    23  void main()
    24  {
    25    auto m = new Method;
    26
    27    m.makecall(0,1);
    28    makecall(0,1);
    29  }

And when I compile with "Digital Mars D Compiler v2.014" I get this error:

test6.d(27): Error: m.makecall is not a declaration
test6.d(27): Error: function expected before (), not 1 of type int

Can anyone explain what is going on here? It seems like it should work. Note
that if you comment out line 27 and compile it compiles fine and runs producing
the expected output:

tcall...01

-Thanks, Derek
Jul 23 2008
parent "Jarrett Billingsley" <kb3ctd2 yahoo.com> writes:
"Derek Ney" <derek hipgraphics.com> wrote in message 
news:g67eru$276j$1 digitalmars.com...
I am trying to create a set of methods that take a variable number of 
arguments (at compile time). I would have liked to have used template 
functions to do that, but I need the functions to be virtual, and template 
functions cannot be virtual. So I thought I would try to use a mixin of a 
variadic template function. But I am getting a weird compiler error with my 
simple test program. Here is the test program:

     1  import std.stdio;
     2
     3  template TCALL(ARGS...)
     4  {
     5    void makecall(ARGS args)
     6    {
     7      writefln("tcall...", args);
     8    }
     9  }
    10
    11  mixin TCALL!();
    12  mixin TCALL!(int);
    13  mixin TCALL!(int,int);
    14
    15
    16  class Method
    17  {
    18    mixin TCALL!();
    19    mixin TCALL!(int);
    20    mixin TCALL!(int,int);
    21  }
    22
    23  void main()
    24  {
    25    auto m = new Method;
    26
    27    m.makecall(0,1);
    28    makecall(0,1);
    29  }

 And when I compile with "Digital Mars D Compiler v2.014" I get this error:

 test6.d(27): Error: m.makecall is not a declaration
 test6.d(27): Error: function expected before (), not 1 of type int

 Can anyone explain what is going on here? It seems like it should work. 
 Note that if you comment out line 27 and compile it compiles fine and runs 
 producing the expected output:

 tcall...01

 -Thanks, Derek

My guess is that it's a bug. If you only mix in one version (say, the (int, int) version), it works, and it's virtual. And the global versions work fine. I'd expect the methods to work fine as well.
Jul 23 2008