56 linhas
1.2 KiB
C
56 linhas
1.2 KiB
C
|
#pragma once
|
||
|
|
||
|
#include <tuple>
|
||
|
#include<type_traits>
|
||
|
|
||
|
namespace sqlite {
|
||
|
namespace utility {
|
||
|
|
||
|
template<typename> struct function_traits;
|
||
|
|
||
|
template <typename Function>
|
||
|
struct function_traits : public function_traits<
|
||
|
decltype(&std::remove_reference<Function>::type::operator())
|
||
|
> { };
|
||
|
|
||
|
template <
|
||
|
typename ClassType,
|
||
|
typename ReturnType,
|
||
|
typename... Arguments
|
||
|
>
|
||
|
struct function_traits<
|
||
|
ReturnType(ClassType::*)(Arguments...) const
|
||
|
> : function_traits<ReturnType(*)(Arguments...)> { };
|
||
|
|
||
|
/* support the non-const operator ()
|
||
|
* this will work with user defined functors */
|
||
|
template <
|
||
|
typename ClassType,
|
||
|
typename ReturnType,
|
||
|
typename... Arguments
|
||
|
>
|
||
|
struct function_traits<
|
||
|
ReturnType(ClassType::*)(Arguments...)
|
||
|
> : function_traits<ReturnType(*)(Arguments...)> { };
|
||
|
|
||
|
template <
|
||
|
typename ReturnType,
|
||
|
typename... Arguments
|
||
|
>
|
||
|
struct function_traits<
|
||
|
ReturnType(*)(Arguments...)
|
||
|
> {
|
||
|
typedef ReturnType result_type;
|
||
|
|
||
|
template <std::size_t Index>
|
||
|
using argument = typename std::tuple_element<
|
||
|
Index,
|
||
|
std::tuple<Arguments...>
|
||
|
>::type;
|
||
|
|
||
|
static const std::size_t arity = sizeof...(Arguments);
|
||
|
};
|
||
|
|
||
|
}
|
||
|
}
|