mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-26 07:02:11 +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:
|
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...>) {
|
||||||
|
@ -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 { };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user