//function_traits.h,获得函数返回值类型、参数tuple、成员函数指针中的对象类型
//参考https://github.com/qicosmos/cosmos/blob/master/function_traits.hpp,进行了精简和补充
#pragma once
#include <functional>
#include <tuple>

//类模板原型
template<typename T>
struct function_traits;

//普通函数
template<typename Ret, typename... Args>
struct function_traits<Ret(Args...)> {
	typedef Ret return_type;
	typedef std::tuple<std::remove_const_t<std::remove_reference_t<Args>>...> bare_tuple_type;
};

//函数指针
template<typename Ret, typename... Args>
struct function_traits<Ret(*)(Args...)> : function_traits<Ret(Args...)>{};

//std::function.
template <typename Ret, typename... Args>
struct function_traits<std::function<Ret(Args...)>> : function_traits<Ret(Args...)>{};

//成员函数,以及成员函数指针中的对象类型
#define FUNCTION_TRAITS(...)
template <typename Ret, typename Obj, typename... Args>
struct function_traits<Ret(Obj::*)(Args...) __VA_ARGS__> : function_traits<Ret(Args...)>
{ typedef Obj object_type; };

FUNCTION_TRAITS()
FUNCTION_TRAITS(const)
FUNCTION_TRAITS(volatile)
FUNCTION_TRAITS(const volatile)

//函数对象
template<typename Callable>
struct function_traits : function_traits<decltype(&Callable::operator())>{};

template <typename Fun>
typename function_traits<Fun>::stl_function_type to_function(const Fun& lambda) {
	return static_cast<typename function_traits<Fun>::stl_function_type>(lambda);
}

template <typename Fun>
typename function_traits<Fun>::stl_function_type to_function(Fun&& lambda) {
	return static_cast<typename function_traits<Fun>::stl_function_type>(std::forward<Fun>(lambda));
}

template <typename Fun>
typename function_traits<Fun>::pointer to_function_pointer(const Fun& lambda) {
	return static_cast<typename function_traits<Fun>::pointer>(lambda);
}

  

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!