For this, you do not need either a function or enable_if.
Here is an example:
enum class vals {
Val1,
Val2,
Val3,
Val4
};
template<vals v, bool = (v == vals::Val1 || v == vals::Val3)>
class MyClass;
template<vals v>
class MyClass<v, true> { };
int main() {
MyClass<vals::Val1> ok;
// MyClass<vals::Val2> ko;
}
: MyClass<vals::Val2, true> ok; - .
, , .
enable_if, :
#include<type_traits>
enum class vals {
Val1,
Val2,
Val3,
Val4
};
template<vals v, std::enable_if_t<(v == vals::Val1 || v == vals::Val3)>* = nullptr>
class MyClass { };
int main() {
MyClass<vals::Val1> ok;
}
static_assert:
enum class vals {
Val1,
Val2,
Val3,
Val4
};
template<vals v>
class MyClass {
static_assert((v == vals::Val1 || v == vals::Val3), "!");
};
int main() {
MyClass<vals::Val1> ok;
}
, , constexpr ed.
constexpr, @n.m. .