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 将类型的性质、特性封装起来,可用于判断类型的特性:

  • 这个类型是否为 pointer ?
  • 这个类型是否为 reference ?
  • 这个类型是否具体某个特性?

在实现通用的算法或业务逻辑时,可以根据数据类型的特性,选择不同的实现细节

实例1:is_pointer

template <typename T>
struct is_pointer
{
    static const bool value = false;
};

template <typename T>
struct is_pointer<T*>
{
    static const bool value = true;
};

template<typename T>
void algorithm(T& object)
{
    std::cout << "is_pointer:" << is_pointer<T>::value << std::endl;
}

int main()
{
    int a = 100;
    algorithm(a);

    int *b = &a;
    algorithm(b);

    return 0;
}

参考资料

An introduction to C++ Traits

https://accu.org/index.php/journals/442

C++ Reference: type_traits

http://www.cplusplus.com/reference/type_traits/

原文地址:https://www.cnblogs.com/benxie/p/11356863.html

时间: 2024-10-09 21:02:18

C++: C++ type traits technique的相关文章

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>(arg

格式工厂(七)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)

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相关的.还

Google C++ 代码规范

Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard Forward Declarations Inline Functions Names and Order of Includes Scoping Namespaces Unnamed Namespaces and Static Variables Nonmember, Static Member, and