Hacker News
Show HN: Beautiful Type Erasure with C++26 Reflection
Check out the source code: https://github.com/RyanJK5/rjk-duck
Leherenn
|next
[-]
I see there's an issue in the tracker to get more accurate data, and since it's using an under dev feature in compilers, it's not going to be definitive, but any rough numbers?
RyanJK5
|root
|parent
[-]
One reason is that, like you said, the feature is still new. Additionally I made pretty liberal use of the std::ranges library in my implementation which has notoriously bad compile times. That could be an area to improve upon.
Another may be a bit more structural. If you want to call myObj.foo() via reflection, you have to linearly search members_of(myObj) for the one named "foo", and then call that. Actual compilers I assume use some kind of hash table.
The hand-waving solution is "put it in a PCH", but I am hoping to put some more effort into optimizing build time here in the future.
feverzsj
|next
|previous
[-]
limaoscarjuliet
|root
|parent
|next
[-]
RyanJK5
|root
|parent
|next
|previous
[-]
As an aside, you may want to check out Jai's approach. I believe everything you generate statically gets turned into a file by the compiler for debugging purposes, which it provides references to in the output.
usrnm
|next
|previous
[-]
Or you just used void* and went on with your life
gmueckl
|next
|previous
[-]
aw1621107
|root
|parent
[-]
[0]: https://github.com/compiler-explorer/compiler-explorer/pull/...
[1]: https://github.com/compiler-explorer/compiler-explorer/blob/...
rob74
|next
|previous
[-]
...but, as they say, beauty is in the eye of the beholder!
bunderbunder
|root
|parent
|next
[-]
It’s a bit like a well-kept Victorian home. The amount of work, money, and dealing with discomfort that goes into maintaining one isn’t something I really want to experience for myself. But the amount of skill and craftsmanship that it takes to preserve one is still impressive, and I have to appreciate the respect for history and the care that goes into balancing it with modern concerns.
And talking to people who do live the life is always a great learning experience.
abcd_f
|root
|parent
|next
[-]
If there's something that C++ actually lacks, that's the elegance, grace and beauty. The rest, it's all already there or will be there shortly :)
bunderbunder
|root
|parent
|next
[-]
connicpu
|root
|parent
|next
|previous
[-]
rob74
|root
|parent
|previous
[-]
HelloNurse
|root
|parent
[-]
RyanJK5
|root
|parent
|next
|previous
[-]
ahartmetz
|root
|parent
|next
[-]
flossly
|root
|parent
|previous
[-]
I'm also glad I do not write C++ on the daily anymore: luckily my software does not need that kind of performance characteristics.
WhitneyLand
|root
|parent
|previous
[-]
I used to think that was a personal limitation, until I saw an interview with Bjarne explaining that he used to understand all of it but at this point it’s too big, no one can anymore.
schaefer
|next
|previous
[-]
```
10: rjk::duck<Container> c{std::vector<int>{1, 2, 3}};
11: c.size(); // 3
12:
13: c = std::string{"hello"};
```
Does the assignment on line 13 call the destrucor for the vector of ints created on line 10?
RyanJK5
|root
|parent
|next
[-]
As a bonus, if you tried passing in an lvalue, it will reject the input unless you add the "copyable" trait, so it ends up mitigating some hidden copies.