Is there a workaround to do something like this?
if constexpr (std::floating_point<T>) {}
else if constexpr (std::integral<T>) {}
...
else static_failure("Feature expansion needed");
because if I replace static_failure with static_assert, it needs the replication of all the above conditions (they are many and complicated) and it becomes ugly.
// It does not work properly: always fail
else static_assert(false, "Feature expansion needed");
// works fine, but it is ugly
else static_assert(std::floating_point<T> || std::integral<T> || ... || ... || ..., "Feature expansion needed");
I do not prefer a runtime behavior like:
throw "Feature expansion needed";
In C++23, you might use
static_assert(false);in non-instantiated context. Before, it would be ill-formed NDR, but most compiler do diagnostic on that.Before C++23, you have to cheat, common legal way is with
always_false:and then