mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
add noexcept specializations to meta (detail) template trait structs
fixes the noexcept tests for C++17 (on my compiler)
This commit is contained in:
parent
db39b2f316
commit
39fdb5e041
|
@ -54,12 +54,13 @@ namespace sol {
|
||||||
template <std::size_t I, typename T>
|
template <std::size_t I, typename T>
|
||||||
using void_tuple_element_t = typename void_tuple_element<I, T>::type;
|
using void_tuple_element_t = typename void_tuple_element<I, T>::type;
|
||||||
|
|
||||||
template <bool has_c_variadic, typename T, typename R, typename... Args>
|
template <bool it_is_noexcept, bool has_c_variadic, typename T, typename R, typename... Args>
|
||||||
struct basic_traits {
|
struct basic_traits {
|
||||||
private:
|
private:
|
||||||
typedef std::conditional_t<std::is_void<T>::value, int, T>& first_type;
|
typedef std::conditional_t<std::is_void<T>::value, int, T>& first_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static const bool is_noexcept = it_is_noexcept;
|
||||||
static const bool is_member_function = std::is_void<T>::value;
|
static const bool is_member_function = std::is_void<T>::value;
|
||||||
static const bool has_c_var_arg = has_c_variadic;
|
static const bool has_c_var_arg = has_c_variadic;
|
||||||
static const std::size_t arity = sizeof...(Args);
|
static const std::size_t arity = sizeof...(Args);
|
||||||
|
@ -79,123 +80,250 @@ namespace sol {
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Signature, bool b = has_deducible_signature<Signature>::value>
|
template<typename Signature, bool b = has_deducible_signature<Signature>::value>
|
||||||
struct fx_traits : basic_traits<false, void, void> {};
|
struct fx_traits : basic_traits<false, false, void, void> {};
|
||||||
|
|
||||||
// Free Functions
|
// Free Functions
|
||||||
template<typename R, typename... Args>
|
template<typename R, typename... Args>
|
||||||
struct fx_traits<R(Args...), false> : basic_traits<false, void, R, Args...> {
|
struct fx_traits<R(Args...), false> : basic_traits<false, false, void, R, Args...> {
|
||||||
typedef R(*function_pointer_type)(Args...);
|
typedef R(*function_pointer_type)(Args...);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename R, typename... Args>
|
template<typename R, typename... Args>
|
||||||
struct fx_traits<R(*)(Args...), false> : basic_traits<false, void, R, Args...> {
|
struct fx_traits<R(*)(Args...), false> : basic_traits<false, false, void, R, Args...> {
|
||||||
typedef R(*function_pointer_type)(Args...);
|
typedef R(*function_pointer_type)(Args...);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename R, typename... Args>
|
template<typename R, typename... Args>
|
||||||
struct fx_traits<R(Args..., ...), false> : basic_traits<true, void, R, Args...> {
|
struct fx_traits<R(Args..., ...), false> : basic_traits<false, true, void, R, Args...> {
|
||||||
typedef R(*function_pointer_type)(Args..., ...);
|
typedef R(*function_pointer_type)(Args..., ...);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename R, typename... Args>
|
template<typename R, typename... Args>
|
||||||
struct fx_traits<R(*)(Args..., ...), false> : basic_traits<true, void, R, Args...> {
|
struct fx_traits<R(*)(Args..., ...), false> : basic_traits<false, true, void, R, Args...> {
|
||||||
typedef R(*function_pointer_type)(Args..., ...);
|
typedef R(*function_pointer_type)(Args..., ...);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
|
template<typename R, typename... Args>
|
||||||
|
struct fx_traits<R(Args...) noexcept, false> : basic_traits<true, false, void, R, Args...> {
|
||||||
|
typedef R(*function_pointer_type)(Args...);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename R, typename... Args>
|
||||||
|
struct fx_traits<R(*)(Args...) noexcept, false> : basic_traits<true, false, void, R, Args...> {
|
||||||
|
typedef R(*function_pointer_type)(Args...);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename R, typename... Args>
|
||||||
|
struct fx_traits<R(Args..., ...) noexcept, false> : basic_traits<true, true, void, R, Args...> {
|
||||||
|
typedef R(*function_pointer_type)(Args..., ...);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename R, typename... Args>
|
||||||
|
struct fx_traits<R(*)(Args..., ...) noexcept, false> : basic_traits<true, true, void, R, Args...> {
|
||||||
|
typedef R(*function_pointer_type)(Args..., ...);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
/* C-Style Variadics */
|
/* C-Style Variadics */
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...), false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...), false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...);
|
typedef R(T::* function_pointer_type)(Args...);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...), false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...), false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...);
|
typedef R(T::* function_pointer_type)(Args..., ...);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
/* Const Volatile */
|
/* Const Volatile */
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) const, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) const, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) const;
|
typedef R(T::* function_pointer_type)(Args...) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) const, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) const, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) const;
|
typedef R(T::* function_pointer_type)(Args..., ...) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) const volatile, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) const volatile, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) const volatile;
|
typedef R(T::* function_pointer_type)(Args...) const volatile;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) const volatile, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) const volatile, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) const volatile;
|
typedef R(T::* function_pointer_type)(Args..., ...) const volatile;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
|
/* Const Volatile */
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) const noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) const noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) const volatile noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) const volatile;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) const volatile noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) const volatile;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
/* Member Function Qualifiers */
|
/* Member Function Qualifiers */
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) &, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) &, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) &;
|
typedef R(T::* function_pointer_type)(Args...) &;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) &, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) &, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) &;
|
typedef R(T::* function_pointer_type)(Args..., ...) &;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) const &, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) const &, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) const &;
|
typedef R(T::* function_pointer_type)(Args...) const &;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) const &, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) const &, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) const &;
|
typedef R(T::* function_pointer_type)(Args..., ...) const &;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) const volatile &, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) const volatile &, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) const volatile &;
|
typedef R(T::* function_pointer_type)(Args...) const volatile &;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) const volatile &, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) const volatile &, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) const volatile &;
|
typedef R(T::* function_pointer_type)(Args..., ...) const volatile &;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) && , false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) && , false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) && ;
|
typedef R(T::* function_pointer_type)(Args...) && ;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) && , false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) && , false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) && ;
|
typedef R(T::* function_pointer_type)(Args..., ...) && ;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) const &&, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) const &&, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) const &&;
|
typedef R(T::* function_pointer_type)(Args...) const &&;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) const &&, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) const &&, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) const &&;
|
typedef R(T::* function_pointer_type)(Args..., ...) const &&;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args...) const volatile &&, false> : basic_traits<false, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args...) const volatile &&, false> : basic_traits<false, false, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args...) const volatile &&;
|
typedef R(T::* function_pointer_type)(Args...) const volatile &&;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, typename R, typename... Args>
|
template<typename T, typename R, typename... Args>
|
||||||
struct fx_traits<R(T::*)(Args..., ...) const volatile &&, false> : basic_traits<true, T, R, Args...> {
|
struct fx_traits<R(T::*)(Args..., ...) const volatile &&, false> : basic_traits<false, true, T, R, Args...> {
|
||||||
typedef R(T::* function_pointer_type)(Args..., ...) const volatile &&;
|
typedef R(T::* function_pointer_type)(Args..., ...) const volatile &&;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) & noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) &;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) & noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) &;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) const & noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) const &;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) const & noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) const &;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) const volatile & noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) const volatile &;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) const volatile & noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) const volatile &;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) && noexcept , false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) && ;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) && noexcept , false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) && ;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) const && noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) const &&;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) const && noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) const &&;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args...) const volatile && noexcept, false> : basic_traits<true, false, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args...) const volatile &&;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename R, typename... Args>
|
||||||
|
struct fx_traits<R(T::*)(Args..., ...) const volatile && noexcept, false> : basic_traits<true, true, T, R, Args...> {
|
||||||
|
typedef R(T::* function_pointer_type)(Args..., ...) const volatile &&;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
template<typename Signature>
|
template<typename Signature>
|
||||||
struct fx_traits<Signature, true> : fx_traits<typename fx_traits<decltype(&Signature::operator())>::function_type, false> {};
|
struct fx_traits<Signature, true> : fx_traits<typename fx_traits<decltype(&Signature::operator())>::function_type, false> {};
|
||||||
|
|
||||||
|
|
|
@ -233,6 +233,85 @@ namespace sol {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) noexcept> : public member_function_wrapper<R(O:: *)(Args...) noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) const noexcept> : public member_function_wrapper<R(O:: *)(Args...) const noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) const volatile noexcept> : public member_function_wrapper<R(O:: *)(Args...) const volatile noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) & noexcept> : public member_function_wrapper<R(O:: *)(Args...) & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) const & noexcept> : public member_function_wrapper<R(O:: *)(Args...) const & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) const volatile & noexcept> : public member_function_wrapper<R(O:: *)(Args...) const volatile & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args..., ...) & noexcept> : public member_function_wrapper<R(O:: *)(Args..., ...) & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args..., ...) const & noexcept> : public member_function_wrapper<R(O:: *)(Args..., ...) const & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args..., ...) const volatile & noexcept> : public member_function_wrapper<R(O:: *)(Args..., ...) const volatile & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) && noexcept> : public member_function_wrapper<R(O:: *)(Args...) & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) const && noexcept> : public member_function_wrapper<R(O:: *)(Args...) const & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args...) const volatile && noexcept> : public member_function_wrapper<R(O:: *)(Args...) const volatile & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args..., ...) && noexcept> : public member_function_wrapper<R(O:: *)(Args..., ...) & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args..., ...) const && noexcept> : public member_function_wrapper<R(O:: *)(Args..., ...) const & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename R, typename O, typename... Args>
|
||||||
|
struct wrapper<R(O:: *)(Args..., ...) const volatile && noexcept> : public member_function_wrapper<R(O:: *)(Args..., ...) const volatile & noexcept, R, O, Args...> {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//#if __cpp_noexcept_function_type >= 201510L //noexcept has become a part of a function's type
|
||||||
|
|
||||||
} // sol
|
} // sol
|
||||||
|
|
||||||
#endif // SOL_WRAPPER_HPP
|
#endif // SOL_WRAPPER_HPP
|
||||||
|
|
Loading…
Reference in New Issue
Block a user