Commit 260bc58f authored by Wenzel Jakob's avatar Wenzel Jakob
Browse files

improved SFINAE in type_caster_generic (closes #70)

parent 92b2f452
...@@ -209,11 +209,11 @@ public: ...@@ -209,11 +209,11 @@ public:
operator type*() { return (type *) value; } operator type*() { return (type *) value; }
operator type&() { return *((type *) value); } operator type&() { return *((type *) value); }
protected: protected:
template <typename T = type, typename std::enable_if<std::is_copy_constructible<T>::value, int>::type = 0> template <typename T = type, typename std::enable_if<detail::is_copy_constructible<T>::value, int>::type = 0>
static void *copy_constructor(const void *arg) { static void *copy_constructor(const void *arg) {
return new type(*((const type *) arg)); return new type(*((const type *) arg));
} }
template <typename T = type, typename std::enable_if<!std::is_copy_constructible<T>::value, int>::type = 0> template <typename T = type, typename std::enable_if<!detail::is_copy_constructible<T>::value, int>::type = 0>
static void *copy_constructor(const void *) { return nullptr; } static void *copy_constructor(const void *) { return nullptr; }
}; };
......
...@@ -240,6 +240,14 @@ template <typename T> struct intrinsic_type<T&&> { typedef type ...@@ -240,6 +240,14 @@ template <typename T> struct intrinsic_type<T&&> { typedef type
template <typename T, size_t N> struct intrinsic_type<const T[N]> { typedef typename intrinsic_type<T>::type type; }; template <typename T, size_t N> struct intrinsic_type<const T[N]> { typedef typename intrinsic_type<T>::type type; };
template <typename T, size_t N> struct intrinsic_type<T[N]> { typedef typename intrinsic_type<T>::type type; }; template <typename T, size_t N> struct intrinsic_type<T[N]> { typedef typename intrinsic_type<T>::type type; };
/** \brief SFINAE helper class to check if a copy constructor is usable (in contrast to
* std::is_copy_constructible, this class also checks if the 'new' operator is accessible */
template <typename T> struct is_copy_constructible {
template <typename T2> static std::true_type test(decltype(new T2(std::declval<T2>())) *);
template <typename T2> static std::false_type test(...);
static const bool value = std::is_same<std::true_type, decltype(test<T>(nullptr))>::value;
};
/// Helper type to replace 'void' in some expressions /// Helper type to replace 'void' in some expressions
struct void_type { }; struct void_type { };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment