digitalmars.D - mixin template as virtual function with variadic params not working
- Derek Ney (36/36) Jul 23 2008 I am trying to create a set of methods that take a variable number of ar...
- Jarrett Billingsley (5/48) Jul 23 2008 My guess is that it's a bug. If you only mix in one version (say, the (...
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
"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








"Jarrett Billingsley" <kb3ctd2 yahoo.com>