In my grad school days, a couple of decades ago, I had written a library for my own use to chain different kinds of numeric operations on data vectors. Essentially a very simple form of deforestation.
GCC, quite surprisingly, was quite good at generating SIMD code from it and eliminating temporary data vectors. GCC was even quite good at explaining why it didn't emit SIMD. Much to my surprise GCC was better in this regard than Clang. From what I had read about Clang at that time it should have been the otherway round. The error messages were better too (wonders of competition).
I quite liked it. It was a lot of fun. I would however be wary of using it in anger.
The problem is, this sublanguage feels more like a dynamically typed language and errors would be thrown deep in the instantiation chain when it ultimately failed to instantiate.
There was no type-system to guide you ahead-of-time that what you are trying to do would eventually fail to instantiate.
The code got lost when Bitbucket stopped it's support for Mercurial. I still likely have it somewhere in my old files.
Later I wanted to rewrite this in D but never started.
While cool for those stuck in C++17, which are plenty given the C++ version of "can I use", C++26 should make many of these approaches more easily available.
However it is still a few years away to be widely deployed, and a few niceties have been postponed into C++29.
Template metaprogramming isn't really suited for this task, the prime sieve here serves only as a proof of concept, meant to show the capabilities of this style. But there are cases where `constexpr` is not applicable, especially when involving type manipulations.
On the other hand, C++ template metaprogramming, as an esolang, is fun to tame and experiment with.
GCC, quite surprisingly, was quite good at generating SIMD code from it and eliminating temporary data vectors. GCC was even quite good at explaining why it didn't emit SIMD. Much to my surprise GCC was better in this regard than Clang. From what I had read about Clang at that time it should have been the otherway round. The error messages were better too (wonders of competition).
I quite liked it. It was a lot of fun. I would however be wary of using it in anger.
The problem is, this sublanguage feels more like a dynamically typed language and errors would be thrown deep in the instantiation chain when it ultimately failed to instantiate.
There was no type-system to guide you ahead-of-time that what you are trying to do would eventually fail to instantiate.
The code got lost when Bitbucket stopped it's support for Mercurial. I still likely have it somewhere in my old files.
Later I wanted to rewrite this in D but never started.
reply