Bill Baxter wrote: > On Fri, Aug 21, 2009 at 10:36 AM, div0<d...@users.sourceforge.net> wrote: >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> Not sure what the original choice was based on, but what you suggest >> looks wrong to me. You aren't necessarily using a template in order to >> mix it in somewhere. >> >> With that syntax it looks like you can only use foo as a mixin. If you >> change 'mixin' to 'paste' your way round looks even more wrong. > > At least for templates that are just a bunch of alias declarations, it > can be handy to be able to use directly or to mix in. So there would > be little to be gained by forcing the developer to choose "mixin" or > "regular template" up front. > > For example > > template MeshTypes(MeshType) { > alias MeshType mesh_type > alias typeof(MeshType.vertices[0]) vert_type; > alias typeof(MeshType.vertices[0].x) float_type; > const uint vert_dim = vert_type.length; > } > > That's handy to use inline like MeshTypes!(MyMesh).vert_type > Or you can mix it in to another class that uses mesh a lot to have all > those types defined inside your class too. > > --bb
Alright, good example. But then why not: mixin MeshTypes(MeshType) { alias MeshType mesh_type alias typeof(MeshType.vertices[0]) vert_type; alias typeof(MeshType.vertices[0].x) float_type; const uint vert_dim = vert_type.length; } template MeshTypesOf(MeshType) { mixin MeshTypes!(MeshType); } Admittedly it is not as clean and violates DRY some. But it does allow the declarer to explicitly determine how the template/mixin gets used. Eh, I was kinda hoping for a reason better than "there are some cases where you want both a mixin and a template to be the same thing." I thought it might be something obvious to someone; something that I missed. Nonetheless, the template/mixin duality seems fairly benign, so this decision is starting to look somewhat arbitrary to me.