欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

获得函数返回值类型、参数tuple、成员函数指针中的对象类型

程序员文章站 2022-05-25 15:49:15
//function_traits.h,获得函数返回值类型、参数tuple、成员函数指针中的对象类型 //参考https://github.com/qicosmos/cosmos/blob/master/function_traits.hpp,进行了精简和补充 #pragma once #inclu... ......
//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);
}