服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 十分钟学会C++ Traits

十分钟学会C++ Traits

2022-09-16 14:19SolidMango C/C++

本文试图以最简洁的方式阐述对C++ traits 的理解,当你理解了第二个例子的时候,相信你已经理解了C++ traits,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧

最近和一个朋友闲聊的时候他对我说一个人对C++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有道理。

想写一篇C++ traits方面的文章已经有一段时间了,但是说实话traits这项技术确实有些晦涩,很担心写完了达不到期望的效果,于是每每试图以简炼的文字表达,慢慢的就等到了今天。

先说说我为什么专门对这项技术写一篇文章吧。记得当时在看STL/boost代码的时候经常遇到traits,当时惊叹于代码原来可以这样写,但是最初根本是看不懂的,查了一些资料才彻底理解了traits存在的意义。

本质定义:加上一层间接性,换来以定的灵活性。

看下面的代码:

?
1
2
3
4
5
6
template <typename T>
struct is_void
{ static const bool value = false; };
template <>
struct is_void<void>
{ static const bool value = true; };

我们可以这样使用这份代码:

Is_void<false>::value 调用第一份代码,也就是说只要我们传入一个参数像下面这样:

Is_void<T>::value,其中T可以为任意类型,我们就可以判断这个类型是不是void在编译期。

完整测试代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename T>
struct is_void
{
    static const bool value = false;
};
 
template <>
struct is_void<void>
{
    static const bool value = true;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::cout<<is_void<int>::value;
    
    std::cout<<is_void<void>::value;
    return 0;
}

下面我们来看一个复杂点的例子,考验一下你的理解:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
namespace detail{
    template <bool b>
    struct copier
    {
       template<typename I1, typename I2>
       static I2 do_copy(I1 first, I1 last, I2 out);
    };
 
    template <bool b>
    template<typename I1, typename I2>
    I2 copier<b>::do_copy(I1 first, I1 last, I2 out)
    {
       while(first != last)
       {
          *out = *first;
          ++out;
          ++first;
       }
       return out;
    }
    template <>
    struct copier<true>
    {
       template<typename I1, typename I2>
       static I2* do_copy(I1* first, I1* last, I2* out)
       {
          memcpy(out, first, (last-first)*sizeof(I2));
          return out+(last-first);
       }
    };
    }
 
    template<typename I1, typename I2>
    inline I2 copy(I1 first, I1 last, I2 out)
    {
       typedef typename
        boost::remove_cv<
         typename std::iterator_traits<I1>
          ::value_type>::type v1_t;
       typedef typename
        boost::remove_cv<
         typename std::iterator_traits<I2>
          ::value_type>::type v2_t;
       enum{ can_opt =
          boost::is_same<v1_t, v2_t>::value
          && boost::is_pointer<I1>::value
          && boost::is_pointer<I2>::value
          && boost::
          has_trivial_assign<v1_t>::value
       };
       return detail::copier<can_opt>::
          do_copy(first, last, out);
}

总结

本文试图以最简洁的方式阐述对C++ traits 的理解,当你理解了第二个例子的时候,相信你已经理解了C++ traits,恭喜你对C++ 的理解上了一个层次。

Bibliography:

http://www.boost.org/doc/libs/1_31_0/libs/type_traits/c++_type_traits.htm

到此这篇关于十分钟学会C++ Traits的文章就介绍到这了,更多相关C++ Traits内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/pugang/archive/2012/10/17/2727378.html

延伸 · 阅读

精彩推荐
  • C/C++C++数据结构关于栈迷宫求解示例

    C++数据结构关于栈迷宫求解示例

    这篇文章主要为大家介绍了C++数据结构关于栈的迷宫求解示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    笑霸final10202022-03-07
  • C/C++Visual Studio Code (vscode) 配置 C / C++ 环境的流程

    Visual Studio Code (vscode) 配置 C / C++ 环境的流程

    这篇文章主要介绍了Visual Studio Code (vscode) 配置 C / C++ 环境的流程,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参...

    步平凡8812021-08-03
  • C/C++C语言实现班级成绩管理系统

    C语言实现班级成绩管理系统

    这篇文章主要为大家详细介绍了C语言实现班级成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    剑雪封喉天下编程8512021-09-17
  • C/C++关于vs strcpy_s()和strcat_s()用法探究

    关于vs strcpy_s()和strcat_s()用法探究

    这篇文章主要介绍了关于vs strcpy_s()strcat_s()用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    that good6132021-09-06
  • C/C++Mingw64编译wxWidgets 3.0.2常见错误分析

    Mingw64编译wxWidgets 3.0.2常见错误分析

    这篇文章主要介绍了Mingw64编译wxWidgets 3.0.2常见错误分析,需要的朋友可以参考下...

    C++教程网12182021-04-21
  • C/C++C 语言基础之初识 C 语言常量

    C 语言基础之初识 C 语言常量

    C语言中的常量分为以下几种:字面常量、const修饰的常变量、#define定义的标识符常量等,下面我们将详细对C语言这几个常量做介绍,感兴趣的小伙伴可以...

    吞吞吐吐大魔王」11172022-01-06
  • C/C++C++实现简单的图书管理系统

    C++实现简单的图书管理系统

    本文给大家分享的是使用C++实现简单的图书管理系统的代码,本系统采用了面向对象的程序设计方法,文中示例代码介绍的非常详细,具有一定的参考价值...

    C++教程网6602021-03-05
  • C/C++用C语言实现简单五子棋小游戏

    用C语言实现简单五子棋小游戏

    这篇文章主要为大家详细介绍了用C语言实现简单五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    Stout8004062021-12-08