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

      

  • 相关阅读:
    hdu 4162 Shape Number 最小表示法
    codeforces 416B. Appleman and Tree 树形dp
    codeforces 167B . Wizards and Huge Prize 概率dp
    codeforces 617E. XOR and Favorite Number 莫队
    angularJs问题:获取按钮 token < 80 8888 localhost:63342 统一字母大小写
    移动端页面布局需要注意的一些问题
    jqm(jquery mobile)做页面中出现诡异的&nbsp;
    页面中出现诡异的双引号""
    js、jq不能正常执行
    hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)
  • 原文地址:https://www.cnblogs.com/ybmj/p/9651227.html
Copyright © 2011-2022 走看看