Hypothetical C++: easy type creation
spiria.com
spiria.com
Using single-member structs (as explained in [0]) gets you the basic idea, but that's still missing the automatic lifting of the functions of your underlying element. I'm not sure if there is a sane way to do this given the current ecosystem. Perhaps a syntax like `newtype Celsius = int using std::{+, -, abs}` would work?
[0]: https://blog.nelhage.com/2010/10/using-haskells-newtype-in-c...
Maybe support will be added later?
The "Allow internal functionality" proposal doesn't fully work as-is. Imagine you have a type Scalar, which has a function:
Scalar Scalar::scale(Scalar);
If you now do typedecl Scalar Celcius;
you'd get a function for it with the following signature: Celcius Celcius::scale(Celcius);
However, the function you'd actually want is Celcius Celcius::scale(Scalar);
The root problem here is that since the original type mixes different uses of the type, you can't blindly convert all those uses to the new type. typedecl Celsius clone Scalar Scalar::scale(Scalar) -> Celsius Celsius::scale(Scalar);
(In the blog post, the example given is with std::pow())As another possible way to achieve this, here's the huge proposal to add C++ metaclasses, which I'm personally not really a fan of, since it looks like it would add an additional third language on top of C++.
Thus, the general opinion is that everybody would like that feature in one form or another, but it's quite impossible to find a consensus on what the feature would look like.
Friday Q&A 2013-08-02: Type-Safe Scalars with Single-Field Structs
https://mikeash.com/pyblog/friday-qa-2013-08-02-type-safe-sc...