Рассмотрим следующий код:
#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;
}
Я хочу выборочно определить конструктор A:: A (int) только для некоторых типов, используя enable_if. Для всех других типов существует конструктор по умолчанию A:: A (...), который должен быть случайным по умолчанию для компилятора при неудачной замене. Однако это имеет смысл для меня, компилятор (gcc version 4.9.0 20130714) все еще жалуется
sfinae.cpp: При создании "структуры А": sfinae.cpp: 19: 11:
требуется отсюда sfinae.cpp: 9: 5: ошибка: нет типа с именем "тип" в
'struct std:: enable_if'
A (int n): val (n) {};
Что-то вроде этого возможно для конструктора? Возможно ли это с другим конструктором (конструкторами) (copy-constructor и move-constructor)?