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 }
时间: 2024-10-22 16:19:34