码迷,mamicode.com
首页 > 其他好文 > 详细

type traits

时间:2016-07-06 23:09:11      阅读:190      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!