explicitly route type casting operations to desired casting operator (fixes #147)

This commit is contained in:
Wenzel Jakob 2016-03-26 17:14:08 +01:00
parent 0b4895885b
commit 048373c1b4
2 changed files with 18 additions and 2 deletions

View File

@ -504,12 +504,23 @@ public:
} }
protected: protected:
template <typename T> /* Used to select the right casting operator in the two functions below */
using cast_target =
typename std::conditional<
is_tuple<typename intrinsic_type<T>::type>::value, /* special case: tuple/pair -> pass by value */
typename intrinsic_type<T>::type,
typename std::conditional<
std::is_pointer<T>::value,
typename std::add_pointer<typename intrinsic_type<T>::type>::type, /* pass using pointer */
typename std::add_lvalue_reference<typename intrinsic_type<T>::type>::type /* pass using reference */
>::type>;
template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) { template <typename ReturnValue, typename Func, size_t ... Index> ReturnValue call(Func &&f, index_sequence<Index...>) {
return f((Tuple) std::get<Index>(value)...); return f(std::get<Index>(value).operator typename cast_target<Tuple>::type()...);
} }
template <size_t ... Index> type cast(index_sequence<Index...>) { template <size_t ... Index> type cast(index_sequence<Index...>) {
return type((Tuple) std::get<Index>(value)...); return type(std::get<Index>(value).operator typename cast_target<Tuple>::type()...);
} }
template <size_t ... Indices> bool load(handle src, bool convert, index_sequence<Indices...>) { template <size_t ... Indices> bool load(handle src, bool convert, index_sequence<Indices...>) {

View File

@ -257,6 +257,11 @@ template <typename T> struct is_copy_constructible {
static const bool value = std::is_same<std::true_type, decltype(test<T>(nullptr))>::value; static const bool value = std::is_same<std::true_type, decltype(test<T>(nullptr))>::value;
}; };
/// Helper type determine if another type is a variant of a pair/tuple
template <typename T> struct is_tuple : std::false_type { };
template <typename... Args> struct is_tuple <std::tuple<Args...>> : std::true_type { };
template <typename... Args> struct is_tuple <std::pair<Args...>> : std::true_type { };
/// Helper type to replace 'void' in some expressions /// Helper type to replace 'void' in some expressions
struct void_type { }; struct void_type { };