type traits
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相关推荐
- 泛型技巧系列:类型字典和Type Traits
注意:未经许可,本系列禁止转载. 本文所介绍的技巧,是我在研究泛型开发不久就发现并成功运用的技巧.这个技巧是突破.NET泛型限制,达到"看上去很美"境界的法宝.当然本方法也存在重大 ...
- C++11 类型支持之type traits
文章目录 一.type_traits是什么 二.type_traits通常用来做什么 三.辅助基类 四.类型相关判断信息获取 4.1 判断基础类型类别 4.1 判断组合类型类别 4.3 判断类型的属性 ...
- C++ Type traits
C++ Type traits by John Maddock and Steve Cleary DDJ 2000/10 译者:陈崴 侯捷注:本文系北京<程序员>杂志 2001/06 的文 ...
- [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1. 主版本模板类 首先我们来看一段初学者都能看 ...
- STL源码剖析 迭代器iterator的概念 和 traits编程技法
iterator模式定义如下:提供一种方法,使之能够依序巡访某个 聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式. STL的中心思想在于:将数据容器(containers)和算法(a ...
- C++中的萃取机制(traits)
由来 在设计迭代器(iterator)时,考虑到需要经常访问迭代器所指对象之类型,称之为该迭代器的value_type,利用内嵌类型声明typedef可轻松实现隐藏所指对象类型: template&l ...
- 第三章 迭代器(iterators)概念与traits编程技法
迭代器(iterators)概念与traits编程技法 3.1 迭代器设计思想--STL关键所在 3.2 迭代器(iterators)是一种smart pointe 3.3 迭代器相应型别(assoc ...
- 二.traits(萃取机)
文章目录 一.traits(萃取机) 1.iterator_traits负责萃取迭代器的性质(迭代器的特性->相应性别). 2.__type_traits负责萃取型别的特性. 举个例子:unin ...
- c++ Factor泛型编程示例
c++ Factor泛型编程示例 c++ 泛型编程 之Factor (c++ 设计新思维) 一.概述 泛化仿函数是将"请求(函数)封装起来",存储与对象中,该对象是具有" ...
最新文章
- 2021年春季学期-信号与系统-第三次作业参考答案-第五道题
- P1284 三角形牧场
- 计算机在课堂中的应用论文,任务教学法在计算机教学中的应用论文
- boost::log模块测量转储二进制数据的性能
- win7蓝牙怎么连接_台式机蓝牙怎么连接
- POJ 2533 Longest Ordered Subsequence 动态规划
- zuul 自定义策略_如何为您的社区定义指标策略
- 快手:笔试题(版本号比较,平方和为1,合并两个流)
- WinCE OAL中的RAM定制函数
- 源头防堵信息泄露 监管拟全面推行支付标记化
- C#语言与三菱PLC串口通讯
- SpringBoot part4 day15
- 1H413000工业机电工程安装技术—— 1H413010机械设备安装技术
- python自动化测试-最常用的自动化测试框架
- 一个遮罩层怎么遮罩两个图层_遮罩动画只能有两个图层,上面为“遮罩层”,下面为“被遮罩”层。...
- 《胡雪岩·红顶商人》—— 读后总结
- 掌门优课用户量增多,用户看上了它什么?
- 《爱してる 》歌词与音译(大爱哇)
- [架构之路-160]-《软考-系统分析师》-10-系统分析-7-数据与数据流程分析、需求规格说明书
- Vue2 轮播图组件 slide组件