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

type traits的相关文章

格式工厂(七)Type Traits

版权声明:本文为博主原创文章,未经博主允许不得转载. 识别变量的type id,返回true或false,举一个简单使用的例子 template <typename T> void type_traits_output(const T& x) { cout << "\ntype traits for type : " << typeid(T).name() << endl; cout << "is_void\

视频笔记 CppCon 2015:Marshall Clow “Type Traits - what are they and why should I use them?&quot;

Video: CppCon 2015:Marshall Clow "Type Traits - what are they and why should I use them?" https://www.youtube.com/watch?v=VvbTP_k_Df4 如果你需要写关于不同类型的代码,而不是具体的类型,你可能需要了解Type Traits 4:47 C++多少种类型?14 void, nullptr: 只有一个成员在这个type里面 struct 实际上和class 是一

c++11 : static_assert和 type traits

static_assert提供一个编译时的断言检查.如果断言为真,什么也不会发生.如果断言为假,编译器会打印一个特殊的错误信息. 1 2 3 4 5 6 7 8 9 10 11 12 13 template <typename T, size_t Size> class Vector {    static_assert(Size < 3, "Size is too small");    T _points[Size]; }; int main() {    Vec

C++ Type Traits

Custom Type Based on Type Traits #include <stdint.h> #include <string> #include <iostream> enum class SimpleType { ST_INVALID, ST_INT64, ST_UINT64, ST_DOUBLE, ST_STRING }; template<SimpleType stype> struct SimpleType2BuiltinType {

C++: C++ type traits technique

C++ Traits是什么? Think of a trait as a small object whose main purpose is to carry information used by another object or algorithm to determine "policy" or "implementation details". - Bjarne Stroustrup Trait 将类型的性质.特性封装起来,可用于判断类型的特性: 这个类

C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

1.  主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template<class T1, class T2> 5 class A{ 6 public: 7 void function(T1 value1, T2 value2){ 8 cout<<"value1 = "<<value1<<endl; 9 cou

C++模板 - value traits

前面的文章使用了type traits,其实traits还有value traits. 再看一下累加函数: template<typename T> struct traits; template<> struct traits<char> { typedef int AccuT; }; template<> struct traits<int> { typedef int AccuT; }; template<class T> ty

C++模板 - traits &amp; policy

traits和policy在泛型编程里面还是挺常见的.像stl的string实现里面就用到了traits,boost里面也很多地方用到traits. traits和policy很多时候都会一起使用,让我们在泛型编程里面多了一些思路. traits:中文解释为特征,记得候捷在<stl源码剖析>那本书里面还叫做萃取什么的.当我们想从一个类型身上获取他的一个附加特性的时候,往往可以考虑traits.比方说有一个类型T, 对他进行一些操作,然后要返回一个类型,那么可以理解为一个返回类型是跟T相关的.还

《Effective C++》:条款52-条款55

最后这三个条款属于杂项.条款53告诉我们不要忽略警告,虽然程序可以编译通过,但是要搞明白警告信息.条款54和条款55讲解C++的库,一个是TR1文档,一个是Boost.现在C++11标准已定,且有编译器支持.Boost库一些内容已经标准化到C++11,与其学习Boost,不如熟悉C++11中的Boost库内容. 条款53不要轻忽编译器的警告 条款54让自己熟悉包括TR1在内的标准程序库 条款55让自己熟悉Boost 条款53:不要轻忽编译器的警告 许多程序员习惯性的忽略编译器的警告.或许它们认为