ฉันกำลังพยายามสลับระหว่างตัวสร้างการแปลงที่ชัดเจนและโดยนัยผ่าน enable_if
รหัสของฉันในปัจจุบันดูเหมือนว่า
#include <type_traits>
#include <cstdint>
enum class enabled {};
template <bool B, typename T = void> using enable_if_t = typename std::enable_if<B, T>::type;
template <bool B, typename T = void> using disable_if_t = typename std::enable_if<!B, T>::type;
template <std::intmax_t A> struct SStruct
{
static constexpr std::intmax_t a = A;
};
template <typename T> struct SCheckEnable : std::integral_constant<bool, T::a == 0>
{
};
template <typename U, typename T> class CClass
{
public:
template <typename T2, enable_if_t<SCheckEnable<U>::value, enabled>...> constexpr CClass(T2 v) : val(v) {};
template <typename T2, disable_if_t<SCheckEnable<U>::value, enabled>...> explicit constexpr CClass(T2 v) : val(v) {};
private:
T val;
};
int main()
{
CClass<SStruct<0>, double> a = 1; // should use implicit constructor
CClass<SStruct<1>, double> b = CClass<SStruct<1>, double>(1); // should use explicit constructor
}
true
ใน enable_if
s ขึ้นอยู่กับพารามิเตอร์เทมเพลต U
หากฉันพยายามคอมไพล์ตัวอย่างขั้นต่ำนี้โดยเปิดใช้งาน g++ 4.9.1
และ --std=c++11
ฉันได้รับข้อผิดพลาดต่อไปนี้
sfinae.cpp: In substitution of ‘template<bool B, class T> using disable_if_t = typename std::enable_if<(! B), T>::type [with bool B = true; T = enabled]’:
sfinae.cpp:13:52: required from here
sfinae.cpp:7:95: error: no type named ‘type’ in ‘struct std::enable_if<false, enabled>’
template <bool B, typename T = void> using disable_if_t = typename std::enable_if<!B, T>::type;
^
sfinae.cpp:19:68: error: prototype for ‘constexpr CClass<U, T>::CClass(T2)’ does not match any in class ‘CClass<U, T>’
template <typename U, typename T> template <typename T2> constexpr CClass<U, T>::CClass(T2 v) : val(v)
^
sfinae.cpp:13:77: error: candidates are: template<class U, class T> template<class T2, int ...<anonymous> > constexpr CClass<U, T>::CClass(T2)
template <typename T2, disable_if_t<true, enabled>...> explicit constexpr CClass(T2 v);
^
sfinae.cpp:12:67: error: template<class U, class T> template<class T2, enabled ...<anonymous> > constexpr CClass<U, T>::CClass(T2)
template <typename T2, enable_if_t<true, enabled>...> constexpr CClass(T2 v);
^
มีความคิดใดที่จะเลือกระหว่างโครงสร้างที่ชัดเจนและโดยนัยตามพารามิเตอร์ U
ที่นี่
constexpr
อาจเป็นสาเหตุของสิ่งนี้หรือไม่ - person Uroc327   schedule 15.11.2014true
ในที่นี้ไม่ใช่โค้ดจริง แต่ขึ้นอยู่กับพารามิเตอร์เทมเพลต โค้ดของคุณควรใช้งานได้ - person 0x499602D2   schedule 15.11.2014no type named 'type'...
) ในตัวอย่างขั้นต่ำของฉันที่นั่น - person Uroc327   schedule 15.11.2014std::integral_constant<bool, U::a == 0>::value
เป็นบูลสำหรับenable_if
s โดยที่U::a
คือstatic constexpr std::intmax_t a = ...;
- person Uroc327   schedule 15.11.2014