SFINAE techniques
The rule that a failure of the template argument substitution is not an error - the SFINAE rule - had to be added to the language simply to make certain narrowly defined template functions possible. But the ingenuity of a C++ programmer knows no bounds, and so SFINAE was repurposed and exploited to manually control the overload set by intentionally causing substitution failures. A huge variety of SFINAE-based techniques were invented over the years until the C++20 concepts made most of them obsolete.
Still, some use of SFINAE remains even in C++20, and then there is the vast body of pre-C++20 code that you may need to read, understand, and maintain.
Let’s start with the applications of SFINAE that are still useful even when concepts are available.
SFINAE in C++20
First of all, even in C++20, there are still “natural” type substitution failures. For example, you may want to write this function:
template <typename T> typename...