Hãy xem xét đoạn mã sau:Chọn lớp constructor sử dụng enable_if
#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;
}
tôi muốn chọn lọc xác định constructor A :: A (int) chỉ dành cho một số loại sử dụng enable_if. Đối với tất cả các kiểu khác, hàm tạo mặc định A :: A (...) cần phải là trường hợp mặc định cho trình biên dịch khi không thể thay thế được. Tuy nhiên, điều này có ý nghĩa đối với trình biên dịch của tôi (phiên bản gcc 4.9.0 20130714) vẫn đang khiếu nại
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) {};
Có phải cái này có thể cho người xây dựng không? Điều này có thể xảy ra với một hàm tạo khác (copy-constructor và move-constructor) không?
Có thể là lớp nhà máy trợ giúp kinda? –