Type Traits,  类型萃取,这个概念涉及到的内容太多。基本常用的萃取方法可以参考

http://en.cppreference.com/w/cpp/types

这里主要记录一下对函数的萃取技巧.

 1 template<typename R, typename ...Args>
 2 R FuncWrapper(R(*func)(Args...), Args&&... args)
 3 {
 4     return func(std::forward<Args>(args)...);
 5 }
 6 template<typename R, typename C, typename... Args>
 7 R FuncWrapper(C* c, R(C::*func)(Args...), Args&&... args)
 8 {
 9     return (c->*func)(std::forward<Args>(args)...);
10 }
11 template<typename R, typename C, typename... Args>
12 R FuncWrapper(C* c, R(C::*func)(Args...)const, Args&&... args)
13 {
14     return (c->*func)(std::forward<Args>(args)...);
15 }

上面只是对函数做了简单的包装,并且forward参数调用。

如果需要更精确的参数控制,则可以如下

 1 template <class MemFn, class D = MemFn>
 2 struct FuncTraits {};
 3 /* Ordinary function pointers. */
 4 template <class R, class D>
 5 struct FuncTraits <R(*) (), D>{...};
 6 template <class R, class P1, class D>
 7 struct FuncTraits <R(*) (P1), D>{...};
 8 //...
 9 template <class T, class R, class D>
10 struct FuncTraits <R(T::*) (), D> {...};
11 template <class T, class R,class P1, class D>
12 struct FuncTraits <R(T::*) (P1), D> {
13     typedef P1 A1;
14     template <R(T::*Func)(A1)>
15     struct FuncStub {
16         static R call(T* obj, A1 p1)
17         {
18             return (obj->*Func)(p1);
19         }
20     };
21     static R invoke(void* p, T* obj, A1 p1) {
22         typedef R(*Func)(T*, A1);
23         Func f = *(Func*)&p;
24         return f(obj, p1);
25     }
26 };
27 //...
28 template <class T, class R, class D>
29 struct FuncTraits <R(T::*) ()const, D> {...};
30 template <class T, class R, class P1, class D>
31 struct FuncTraits <R(T::*) (P1)const, D> {...};

对不同参数个数的函数用模板展开,分别在FuncTraits里面定义。

例如

1 template<typename R, typename C, typename... Args>
2 R FuncWrapper(C* c, R(C::*func)(Args...)const, Args&&... args)
3 {
4     typedef FuncTraits<C, R, Args...> Type;
5     return (c->*func)(std::forward<Args>(args)...);
6 }

转载于:https://www.cnblogs.com/goooon/p/5648251.html

type traits相关推荐

  1. 泛型技巧系列:类型字典和Type Traits

    注意:未经许可,本系列禁止转载. 本文所介绍的技巧,是我在研究泛型开发不久就发现并成功运用的技巧.这个技巧是突破.NET泛型限制,达到"看上去很美"境界的法宝.当然本方法也存在重大 ...

  2. C++11 类型支持之type traits

    文章目录 一.type_traits是什么 二.type_traits通常用来做什么 三.辅助基类 四.类型相关判断信息获取 4.1 判断基础类型类别 4.1 判断组合类型类别 4.3 判断类型的属性 ...

  3. C++ Type traits

    C++ Type traits by John Maddock and Steve Cleary DDJ 2000/10 译者:陈崴 侯捷注:本文系北京<程序员>杂志 2001/06 的文 ...

  4. [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

    http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1.  主版本模板类 首先我们来看一段初学者都能看 ...

  5. STL源码剖析 迭代器iterator的概念 和 traits编程技法

    iterator模式定义如下:提供一种方法,使之能够依序巡访某个 聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式. STL的中心思想在于:将数据容器(containers)和算法(a ...

  6. C++中的萃取机制(traits)

    由来 在设计迭代器(iterator)时,考虑到需要经常访问迭代器所指对象之类型,称之为该迭代器的value_type,利用内嵌类型声明typedef可轻松实现隐藏所指对象类型: template&l ...

  7. 第三章 迭代器(iterators)概念与traits编程技法

    迭代器(iterators)概念与traits编程技法 3.1 迭代器设计思想--STL关键所在 3.2 迭代器(iterators)是一种smart pointe 3.3 迭代器相应型别(assoc ...

  8. 二.traits(萃取机)

    文章目录 一.traits(萃取机) 1.iterator_traits负责萃取迭代器的性质(迭代器的特性->相应性别). 2.__type_traits负责萃取型别的特性. 举个例子:unin ...

  9. c++ Factor泛型编程示例

    c++ Factor泛型编程示例 c++ 泛型编程 之Factor (c++ 设计新思维) 一.概述 泛化仿函数是将"请求(函数)封装起来",存储与对象中,该对象是具有" ...

最新文章

  1. 2021年春季学期-信号与系统-第三次作业参考答案-第五道题
  2. P1284 三角形牧场
  3. 计算机在课堂中的应用论文,任务教学法在计算机教学中的应用论文
  4. boost::log模块测量转储二进制数据的性能
  5. win7蓝牙怎么连接_台式机蓝牙怎么连接
  6. POJ 2533 Longest Ordered Subsequence 动态规划
  7. zuul 自定义策略_如何为您的社区定义指标策略
  8. 快手:笔试题(版本号比较,平方和为1,合并两个流)
  9. WinCE OAL中的RAM定制函数
  10. 源头防堵信息泄露 监管拟全面推行支付标记化
  11. C#语言与三菱PLC串口通讯
  12. SpringBoot part4 day15
  13. 1H413000工业机电工程安装技术—— 1H413010机械设备安装技术
  14. python自动化测试-最常用的自动化测试框架
  15. 一个遮罩层怎么遮罩两个图层_遮罩动画只能有两个图层,上面为“遮罩层”,下面为“被遮罩”层。...
  16. 《胡雪岩·红顶商人》—— 读后总结
  17. 掌门优课用户量增多,用户看上了它什么?
  18. 《爱してる 》歌词与音译(大爱哇)
  19. [架构之路-160]-《软考-系统分析师》-10-系统分析-7-数据与数据流程分析、需求规格说明书
  20. Vue2 轮播图组件 slide组件

热门文章

  1. np.newaxis学习【转载】
  2. HTTP之Cookie
  3. GitHub 版本控制 项目托管 04 创建GitHub远程仓库
  4. iOS 自己封装的SDK 打包与合并,新手教程!!!
  5. 1472: C语言实验题――逆置正整数
  6. Android开发,使用背景图(xml drawable)为view 设置边框
  7. SqlServer为什么自动在主键上建立聚集索引
  8. 互斥对象与关键代码段的比较
  9. Docker系列一 ~docker的安装
  10. Laravel 启动流程分析 (代码全流程)