Today, while researching for the upcoming C++17 version of WinLamb, I was rethinking the idea of restricting the allowed types on a template argument. That’s an SFINAE thing, scary to many people – including me sometimes, in my love-hate relationship with advanced C++ stuff.
The thing is that I ended up writing a working piece of code using std::enable_if to restrict a template argument, and I’m quite proud of it.
#include <type_traits>
struct One { int num; };
struct Two { int num; };
struct Tre { int num; };
template<
typename T,
typename = std::enable_if_t<
std::is_same_v<T, One> ||
std::is_same_v<T, Two>
>
>
void foo(T& o) { ++o.num; }
int main() {
One o;
foo(o);
return 0;
}
In the code above, One and Two classes will work with foo(), whereas Tre will not compile, despite being exactly like the others.