Select class constructor using enable_if
c++, constructor, enable-if, sfinae, templates
Solution
With C++20
You can achieve that simply by adding `requires` to the constructor:
A(int n) requires T::value : val(n) { }
The `requires` clause gets a `constant expression` that evaluates to `true` or `false` deciding thus whether to consider this method in the overload resolution, if the requires clause is true, or ignore it otherwise.
Code: https://godbolt.org/z/948z41zKK
Problem
Consider following code: ``` #include <iostream> #include <type_traits> template <typename T> struct A { int val = 0; template <class = typename std::enable_if<T::value>::type> A(int n) : val(n) {}; A(...) { } /* ... */ }; struct YES { constexpr static bool value = true; }; struct NO { constexpr static bool value = false; }; int main() { A<YES> y(10); A<NO> n; std::cout << "YES: " << y.val << std::endl << "NO: " << n.val << std::endl; } ``` I want to selectively define constructor A::A(int) only for some types using enable_if. For all other types there is default constructor A::A(...) which should be the default case for compiler when substitution fails. However this makes sense for me compiler (gcc version 4.9.0 20130714) is still complaining sfinae.cpp: In instantiation of 'struct A': sfinae.cpp:19:11: required from here sfinae.cpp:9:5: error: no type named 'type' in 'struct std::enable_if' A(int n) : val(n) {}; Is something like this possible for constructor? Is this possible with another constructor(s) (copy-constructor and move-constructor)?