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

      

  • 相关阅读:
    Ubuntu下SVN命令行递归加入文件夹文件(免去一个一个的加入 --force)
    oschina插件和扩展
    oschina iOS代码库
    oschina 开发工具
    oschina应用工具
    oschina程序开发
    网络爬虫 kamike.collect
    WebFetch 是无依赖极简网页爬取组件
    commoncrawl 源码库是用于 Hadoop 的自定义 InputFormat 配送实现
    JAVA平台上的网络爬虫脚本语言 CrawlScript
  • 原文地址:https://www.cnblogs.com/ybmj/p/9651227.html
Copyright © 2011-2022 走看看