mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-11 08:03:55 +00:00
explicitly route type casting operations to desired casting operator (fixes #147)
This commit is contained in:
parent
0b4895885b
commit
048373c1b4
@ -504,12 +504,23 @@ public:
|
||||
}
|
||||
|
||||
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...>) {
|
||||
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...>) {
|
||||
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...>) {
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
/// 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
|
||||
struct void_type { };
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user