首页 > 其他 > 详细

type traits

时间:2016-07-06 23:06:46      阅读:324      评论:0      收藏:0      [点我收藏+]

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 }

 

type traits

原文:http://www.cnblogs.com/goooon/p/5648251.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!