Open wilzbach opened 8 years ago
From @stonemaster on June 25, 2016 15:17
Yes this is a complex template but it will be difficult to really dive into details in form a tour gem. This gem is in my eyes more directed to people who already this technique from languages like e.g. C++. And for those interested there are far better (and longer articles) that explain this complicated topic in more detail. Unfortunately I don't see anything how we could make things easier without writing a whole book on this topic. IMO it's still useful for C++ and or other advanced D-newbies..
Yes this is a complex template but it will be difficult to really dive into details in form a tour gem
I think the main problem here is that the example is too complicated (it has 65 lines). We should try to get it to half of the size. At the moment I don't have concrete ideas though.
his gem is in my eyes more directed to people who already this technique from languages like e.g. C++. And for those interested there are far better (and longer articles) that explain this complicated topic in more detail.
I agree ;-)
From @ZombineDev on June 26, 2016 7:11
Here's a simpler and more powerful version of the example:
import std.algorithm.searching : countUntil;
import std.meta : Repeat;
struct VecDef(T, names...)
{
enum N = names.length;
T[N] _elements;
this (Repeat!(N, T) elems)
{
_elements = [elems];
}
ref inout(T) opDispatch(string field)() inout
{
enum size_t idx = [ names ].countUntil(field);
return _elements[idx];
}
}
unittest
{
alias Size = VecDef!(uint, `width`, `height`);
auto s = Size(2, 3);
s.width++;
s.height++;
assert (s.width + s.height == 7);
alias Color = VecDef!(ubyte, `r`, `g`, `b`, `a`);
Color c = Color(15, 17, 19, 3);
assert (c.r == 15);
assert (c.g == 17);
assert (c.b == 19);
assert (c.a == 3);
alias vec3f = VecDef!(float, `x`, `y`, `z`);
auto speed = vec3f(0.25, 0.5, 0.125);
assert (speed.x == 0.25);
assert (speed.y == 0.5);
assert (speed.z == 0.125);
}
But, btw this is not template metaprogramming, but typecons. std.meta
+ std.traits
is what I would call pure metaprogramming
From @ZombineDev on June 26, 2016 7:29
If you want to show is
, I would suggest implementing a JSON <-> struct | struct[] | struct[key] serialization / deserialization. AFAIR, last time I did it, it was less than 60 lines. If you want, I can dig up my code.
If you want to show more general introspection, use DbI (e.g. implenting a range that offers all possible primitives depending on the input) or UDAs (e.g. defining a REST interface, or something along the lines of Robert's talk at DConf http://dconf.org/2016/talks/schadek.html)
From @wilzbach on June 24, 2016 16:48
for a ruby/java guy this looks complicated :
(reported by @claudiug)
Copied from original issue: stonemaster/dlang-tour#366