www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Combining variadic functions with class templates

reply Sebastian Schuberth <sschuberth gmail.com> writes:
Hi,

I'm all new to D (coming from C++), and currently playing around with 
the language. I'm using DMD 2.049 and was expecting this to compile:

struct Vector(alias N,T)
{
     Vector(T[N] v ...) {
         data=v;
     }

     T data[N];
};

alias Vector!(3,float) Vec3f;

void main()
{
     Vec3f v(1,1,1);
}

But instead I get these errors:

Building Release\ConsoleApp1.exe...
main.d(3): found 'v' when expecting ')'
main.d(3): semicolon expected, not '...'
main.d(3): Declaration expected, not '...'
main.d(8): unrecognized declaration
Building Release\ConsoleApp1.exe failed!

What's wrong with the above code? Can member functions / constructors 
not be variadic? Is is not allowed to use template argument N in static 
array variadic function arguments?

Thanks in advance.

-- 
Sebastian Schuberth
Sep 30 2010
parent reply "Simen kjaeraas" <simen.kjaras gmail.com> writes:
Sebastian Schuberth <sschuberth gmail.com> wrote:

 Hi,

 I'm all new to D (coming from C++), and currently playing around with  
 the language. I'm using DMD 2.049 and was expecting this to compile:

 struct Vector(alias N,T)
 {
      Vector(T[N] v ...) {

This is not a constructor, but a malformed function. In D, constructors bear the name 'this'[1].
 What's wrong with the above code? Can member functions / constructors  
 not be variadic? Is is not allowed to use template argument N in static  
 array variadic function arguments?

The error is, as said above, the name of your constructor. This leads to a less-than-readable error message, which ultimately is trying to tell you what I'm saying. [1]: http://digitalmars.com/d/2.0/struct.html#Struct-Constructor -- Simen
Sep 30 2010
next sibling parent reply Sebastian Schuberth <sschuberth gmail.com> writes:
On 30.09.2010 19:58, Simen kjaeraas wrote:

 This is not a constructor, but a malformed function. In D, constructors
 bear the name 'this'[1].

Doh, thanks, I should have already known that ... changing "Vector" to "this" makes it better, but with struct Vector(alias N,T) { this(T[N] v ...) { data=v; } T data[N]; }; alias Vector!(3,float) Vec3f; void main() { Vec3f v(1,1,1); } I still get Building Release\ConsoleApp1.exe... main.d(14): found 'v' when expecting ';' following statement Building Release\ConsoleApp1.exe failed! -- Sebastian Schuberth
Sep 30 2010
parent reply wrzosk <dprogr gmail.com> writes:
W dniu 2010-10-01 03:13, Sebastian Schuberth pisze:
 On 30.09.2010 19:58, Simen kjaeraas wrote:

 This is not a constructor, but a malformed function. In D, constructors
 bear the name 'this'[1].

Doh, thanks, I should have already known that ... changing "Vector" to "this" makes it better, but with struct Vector(alias N,T) { this(T[N] v ...) { data=v; } T data[N]; }; alias Vector!(3,float) Vec3f; void main() { Vec3f v(1,1,1); } I still get Building Release\ConsoleApp1.exe... main.d(14): found 'v' when expecting ';' following statement Building Release\ConsoleApp1.exe failed!

Vec3f v(1,1,1); into Vec3f v = Vec3f(1,1,1);
Sep 30 2010
parent reply Sebastian Schuberth <sschuberth gmail.com> writes:
On 30.09.2010 20:20, wrzosk wrote:

 void main()
 {
 Vec3f v(1,1,1);
 }

 I still get

 Building Release\ConsoleApp1.exe...
 main.d(14): found 'v' when expecting ';' following statement
 Building Release\ConsoleApp1.exe failed!

Vec3f v(1,1,1); into Vec3f v = Vec3f(1,1,1);

Thanks, that works, but that syntax seems a little verbose to me. Is the first syntax generally not supported in D? -- Sebastian Schuberth
Sep 30 2010
parent Pelle <pelle.mansson gmail.com> writes:
On 09/30/2010 08:25 PM, Sebastian Schuberth wrote:
 On 30.09.2010 20:20, wrzosk wrote:

 void main()
 {
 Vec3f v(1,1,1);
 }

 I still get

 Building Release\ConsoleApp1.exe...
 main.d(14): found 'v' when expecting ';' following statement
 Building Release\ConsoleApp1.exe failed!

Vec3f v(1,1,1); into Vec3f v = Vec3f(1,1,1);

Thanks, that works, but that syntax seems a little verbose to me. Is the first syntax generally not supported in D?

It is not. You can use auto v = Vec3f(1,1,1);
Sep 30 2010
prev sibling parent Philippe Sigaud <philippe.sigaud gmail.com> writes:
 Thanks, that works, but that syntax seems a little verbose to me. Is the
 first syntax generally not supported in D?

It is not. You can use auto v = Vec3f(1,1,1);

If you use a creation function, types and length are deduced automatically, there is no need to indicate them to the compiler. Let's add some sugar on top, it complexifies the signature a bit but makes creating a vector a pleasure: import std.traits; auto vector(Ts...)(Ts values) if (!is(CommonType!(Ts) == void)) { return Vector!( CommonType!(Ts), Ts.length)(values); } (CommonType: http://digitalmars.com/d/2.0/phobos/std_traits.html#CommonType) usage: auto v1 = vector(1,2,3); // v1 is a Vector!(int,3) auto v2 = vector(1.5); // v2 is a Vector!(double, 1) auto v3 = vector(1,2, 3.1415, 2.71828); // v3 is a Vector!(double, 4): CommonType!(int,int,double,double) is double auto v4 = vector('a','b'); // Vector!(char,2) auto v5 = vector("abc", 3); // Compile-time error, impossible vector. Philippe
Sep 30 2010