How to Instantiate struct defined in template
Craig Dillabaugh
cdillaba at cg.scs.carleton.ca
Sat Sep 22 21:37:30 PDT 2012
On Sunday, 23 September 2012 at 04:03:28 UTC, Jonathan M Davis
wrote:
> On Sunday, September 23, 2012 05:49:06 Craig Dillabaugh wrote:
>> Hello,
clip
>
> Before anything, I'd question why you declared vt at all. If
> all you're
> putting in it is a single struct, then just templatize the
> struct directly:
>
> struct Vertex(T)
> {
> ...
> }
>
> Now, it looks like you have a free function in there as well -
> euclid_dist -
> but there's no reason to put that in the same template. Just
> templatize it
> directly. Then you get
>
> T euclid_dist(T)(T a, T b) {...}
>
> And main ends up looking something like
>
> void main()
> {
> auto v1 = Vertex!float(0.0, 0.0);
> auto v2 = Vertex!float(2.0, 4.0);
> writefln("The distance between vertex 1 and vertex 2 is %s",
> euclid_dist(v1, v2));
> }
Thanks. I've switched my code to follow your suggestion. One thing
there was a typo in my euclid_dist function, the code for it, and
main now look like:
T euclid_dist(T)(vertex!T a, vertex!T b) {
T sum = 0;
foreach( ref a_crd, ref b_crd; lockstep( a.coords, b.coords ) ) {
sum += (a_crd - b_crd)*(a_crd - b_crd );
}
return sqrt(sum);
}
int main(string argv[] ) {
auto v1 = vertex!float(0.0,0.0);
auto v2 = vertex!float(3.0,4.0);
writeln("The distance between vertex 1 and vertex 2 is ",
euclid_dist!float(v1, v2) );
return 0;
}
One question. Is there any way to get the function template to
deduce the type of T from the vertices I pass, so that I can
call:
euclid_dist(v1, v2) )
instead of:
euclid_dist!float(v1, v2) );
>
> It's actually fairly to explicitly declare a template in D
> outside of
> eponymous templates. If you're dealing with a user-defined type
> or function, it
> almost always makes more sense to templatize them directly.
>
> Now, as for the exact error message, it's because the syntax
> that you're using
> to define v1 and v2 is illegal. You'd need to do either
>
> vt!float.vertex v1 = vt!float(0.0, 0.0);
>
> or preferrably.
>
> auto v1 = vt!float(0.0, 0.0);
>
> You can't construct the type on the left-hand side of the
> assignment operator
> like that.
>
> - Jonathan M Davis
,
More information about the Digitalmars-d-learn
mailing list