zoukankan      html  css  js  c++  java
  • 获得函数返回值类型、参数tuple、成员函数指针中的对象类型

    //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);
    }
    

      

  • 相关阅读:
    MySQL之权限管理
    CentOS7使用firewalld打开关闭防火墙与端口
    CentOS 7.2 基于Docker实现MySQL主从架构
    Centos7下安装Docker
    nginx php-fpm安装配置 CentOS编译安装php7.2
    php7的扩展库安装方法
    Android 程序打包及签名
    Message和handler传递对象
    Android AlertDialog去除黑边白边自定义布局(转)
    用MVC做支付宝手机网页支付问题
  • 原文地址:https://www.cnblogs.com/ybmj/p/9651227.html
Copyright © 2011-2022 走看看