I imagine reflections would make the process more straightforward, requires expressions are powerful but either somewhat verbose or possibly incomplete.
For instance, in your example foo
could have any of the following declarations in a class:
void foo();
int foo() const;
template <typename T> foo(T = { }) &&;
decltype([]() { }) foo;
Oh,
std::enable_if
is straight up worse, they’re unreadable and don’t work when two function overloads (idk about variables) have the same signature.I’m not even sure enable_if can do something that constraints can’t at all…