雅虎香港 搜尋

搜尋結果

  1. 2024年4月4日 · traits干更多东西. 迭代器有常见有五种类型: value_type, difference_type, reference_type, pointer_type都比较容易在 traits 和 相应偏特化中提取。. 但是, iterator_category 一般也有5个,这个相应型别会引发较大规模的写代码工程。. 例如,我们实现了 func_II, func_BI, func ...

  2. 本文介绍如何定义一个 traits类 ,以及如何使用它在编译器获取数据类型. C++中的 Traits 类可以在编译期提供类型信息,它是用 Traits 模板及其特化来实现的。. 通过方法的重载,可以在编译期对类型进行"if…else"判断。. 我们通过STL中的一个例子来介绍 Traits 的实现 ...

    • 问题描述
    • 方案一:函数重载
    • 方案二:模板函数+内置字段
    • 方案三:Traits 模板类
    • 总结

    首先来看 traits 技术可以解决什么问题,我们拥有自定义类型 Foo, Bar,以及编译器自带类型 int, double, string,我们想要为这些不同的类型提供统一的编码函数 decode() ,该怎样实现呢?

    首先想到的方法就是函数重载,对于不同的数据类型提供不同的编码函数实现 这种方案当然可行,但我们不满足于此,因为每增加一种数据类型就需要重新实现一个函数,而同一类数据(int, unsinged int)可以使用同样的编码方法。我们想要的是针对同一种数据类型,只编写一个函数,这样有可能实现吗?

    下面我们尝试使用模板函数来实现,自定义数据类型中定义类型字段,然后在函数中进行判断。 这样一来,对于同一种自定义类型,我们只需要写一遍 decode 函数就可以了,但是对于系统自定义变量 int, double 而言,是无法在其内部定义 type 的,这时候我们该怎么办呢?这时候就需要用到 traits 技术了。

    traits 技术的关键在于,使用另外的模板类 type_traits 来保存不同数据类型的 type,这样就可以兼容自定义数据类型和内置数据类型,代码如下: 对于自定义类型,与方案二中类似,我们在类内部定义了数据类型 type,然后在 traits 类中定义同样的 type 对于内置数据类型,使用模板类的特化为自定义类型生成独有的 type_traits(感谢指证,模板类的特化类型应该写在类名后面) 这样就可以为不同数据类型生成统一的模板函数

    traits 技术的关键在于使用第三方模板类 traits,利用模板特化的功能,实现对自定义数据和编译器内置数据的统一
    tratis 技术常见于标准库的实现中,但对日常开发中降低代码冗余也有很好的借鉴意义
    C++20 提供了 Concept 的特性,使用 Concept 可以使得实现类似的功能更加方便
    本文所举的例子使用了枚举变量来表示数据类型(type),而实际操作中通常使用不同的类来表示不同的类型,这样可以在编写模板函数时更好的优化,这里就不做展开,感兴趣的可以参考《Effective C++》的第47条
  3. 2020年3月24日 · 109 人赞同了该回答. 提一个 Servo 使用过的关于虚函数和继承的 trick 吧: Servo 是 FireFox 中新的 排版引擎 。 按照 Servo 的设计,页面上的 dom 元素类型之间就是 树状扩展 的关系 ,比如 Element <- HTMLElement <- HTMLAreaElement,很明显用继承来表达是比较自然的。 如果是 C++ 的话,半点问题也没有。 但众所周知 Rust 是不支持继承的。 按照 Rust 的组合优于继承的思路,组合之后需要手工写 trait 的实现,变成了 锅炉钢板 (误 - boiler plate)。

  4. 40. 被浏览. 12,473. 3 个回答. 默认排序. d41d8c. type traits 的优势: 1. 可以特化。 template<class> struct my_trait : std::false_type {}; template<class T> struct my_trait<T*> : std::true_type {}; template<> struct my_trait<struct MyType> : std::true_type {}; 这种用 concept 就很难写。 2. 可以有约束。

  5. 2023年2月2日 · 29. 被浏览. 15,605. 7 个回答. 默认排序. 知乎用户. 134 人赞同了该回答. 目录. impl Trait 和 dyn Trait 区别可大了: 编译时多态 (compile-time polymorphism)与 运行时多态 ( run-time polymorphism )的区别。 这个话题展开了讲其实内容很多,我就简单写写 [1] ,进一步了解可以自行根据关键字去查。 注:这两个术语有时也称作静态/ 动态多态 (static/dynamic polymorphism)/动态分派(dynamic dispatch)等,都是差不多的概念。 免责声明.

  6. 2016年7月31日 · 编程语言理论. 多继承和特性 (Trait) 有啥异同? 或者是和协议 (protocol)、混入 (mixin)、或者接口的默认方法 (default) 。 关注者. 239. 被浏览. 26,514. 11 个回答. 刘缙. 如果我们有两个类: class A { public f(); public g(); private int a; private int b; }; class B { public h(); private int x; }; 在组合这两个类的所有方法中,一个极端是仅仅把两个类的对象组合起来,并且给两个类的公开方法都作转发: class AplusB { public f() { a.f(); } public g() { a.g(); }