HackerTrans
TopNewTrendsCommentsPastAskShowJobs

dctwin

no profile record

Submissions

Compile-time JSON deserialization in C++

medium.com
108 points·by dctwin·hace 2 años·88 comments

Wavelet Based Features for Automatic Synthesizer Programming

medium.com
21 points·by dctwin·hace 3 años·0 comments

comments

dctwin
·hace 3 meses·discuss
The layoffs haven't even really started yet... I'm very worried about the next two years
dctwin
·hace 2 años·discuss
Oh I think I finally groked what you suggested! Something like

template <StringLiteral str> static constexpr Key<str> key

in the class namespace - I think this this would work, but if I understand this correctly, You would need to do like

User user {...}; user[User::key<"myKey">]

Which actually is not so bad...
dctwin
·hace 2 años·discuss
Whether or not this is useful (I am also not sure), the JSON doesn't need to survive into runtime at all. If you include the JSON, do a bunch of `if constexpr`, and never touch the JSON outside of a constexpr context, it doesn't have to any footprint on your binary. (I'm not sure if #embed will force stuff to stay in your binary even if you never reference it at runtime)
dctwin
·hace 2 años·discuss
Yes, very true. I noticed that even already at 3dp the floats start to compare unequal. The long double helped but it's not really.

I googled and found two examples of constexpr float parsing repositories, but from the sounds of things, you understand this problem better than I and will have seen them already
dctwin
·hace 2 años·discuss
You're right to point out that this is really 'first class JSON', rather than the Pydantic/Jackson type thing where the json barely exists and is immediately transformed into your models and classes.

Thanks for reading the article though, that's cool. I am a daw_json_link fan
dctwin
·hace 2 años·discuss
The opposite 'toString' problem seems harder - I didn't try, but it should be possible now that std::string is constexpr.

I don't think you could parse it with, say, a class that has a std::string member (because of the transience restriction), but perhaps you can use lambdas that capture that string by reference, and call each other as appropriate?

As for exporting that as some sort of compiler artefact for use elsewhere, I am not sure how you would do that...
dctwin
·hace 2 años·discuss
You can do something similar, no? std::pow is not constexpr (most float stuff is not, presumably due to floating point state) but you can implement 10^x anyway
dctwin
·hace 2 años·discuss
Despite my writing the article I agree
dctwin
·hace 2 años·discuss
Thanks for the idea! Yes constexpr std::vector feels like cheating
dctwin
·hace 2 años·discuss
Yes, the nonconstexpr version does just that, unless I misunderstood your question. See also boost::spirit for a 'big' version of this
dctwin
·hace 2 años·discuss
Hm - so this would instantiate a variable for each key in the class namespace? I admit I haven't seen anything like this but sounds very interesting
dctwin
·hace 2 años·discuss
I was able to do the primitive

long double result = 0.0;

while (...) {

  if (json[head] == '.') ...

  result *= 10; result += json[head] - '0';
}

in a constexpr function with no problem :)
dctwin
·hace 2 años·discuss
Yes, I agree. I don't see much practical use in this. I was just surprised how (relatively) straightforwards this is to do, and thought it was more cool than useful
dctwin
·hace 2 años·discuss
Thank you!
dctwin
·hace 2 años·discuss
Hello! I wrote this short blog post about using pattern-matching-like template metaprogramming to deserialize JSON at build time - please let me know what you think (especially if you see improvements)