专栏首页C++核心准则原文翻译C++核心准则T.65:使用标签分发提供函数的不同实现

C++核心准则T.65:使用标签分发提供函数的不同实现

T.65: Use tag dispatch to provide alternative implementations of a function

T.65:使用标签分发提供函数的不同实现

Reason(原因)

  • A template defines a general interface. 模板定义普遍接口。
  • Tag dispatch allows us to select implementations based on specific properties of an argument type. 标签分发允许我们根据参数类型的特定属性选择实现方式。
  • Performance. 性能

Example(示例)

This is a simplified version of std::copy (ignoring the possibility of non-contiguous sequences)

这是std::copy的简化版本(忽略非连续序列)

struct pod_tag {};
struct non_pod_tag {};

template<class T> struct copy_trait { using tag = non_pod_tag; };   // T is not "plain old data"

template<> struct copy_trait<int> { using tag = pod_tag; };         // int is "plain old data"

template<class Iter>
Out copy_helper(Iter first, Iter last, Iter out, pod_tag)
{
    // use memmove
}

template<class Iter>
Out copy_helper(Iter first, Iter last, Iter out, non_pod_tag)
{
    // use loop calling copy constructors
}

template<class Iter>
Out copy(Iter first, Iter last, Iter out)
{
    return copy_helper(first, last, out, typename copy_trait<Iter>::tag{})
}

void use(vector<int>& vi, vector<int>& vi2, vector<string>& vs, vector<string>& vs2)
{
    copy(vi.begin(), vi.end(), vi2.begin()); // uses memmove
    copy(vs.begin(), vs.end(), vs2.begin()); // uses a loop calling copy constructors
}

This is a general and powerful technique for compile-time algorithm selection.

这是一个可以在编译时选择算法的普遍和强大的技术。

Note(注意)

When concepts become widely available such alternatives can be distinguished directly:

当概念可以被普遍使用时,这样的选项可以直接区分:

template<class Iter>
    requires Pod<Value_type<iter>>
Out copy_helper(In, first, In last, Out out)
{
    // use memmove
}

template<class Iter>
Out copy_helper(In, first, In last, Out out)
{
    // use loop calling copy constructors
}
Enforcement(实施建议)

???

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#t65-use-tag-dispatch-to-provide-alternative-implementations-of-a-function

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则:C.164:避免隐式转换运算符

    Implicit conversions can be essential (e.g., double to int) but often cause surp...

    面向对象思考
  • C++核心准则T.10:为所有的模板参数定义概念

    Correctness and readability. The assumed meaning (syntax and semantics) of a tem...

    面向对象思考
  • C++核心准则CP.200:使用volatile只能表明该变量是非C++内存

    volatile is used to refer to objects that are shared with "non-C++" code or hard...

    面向对象思考
  • Web安全学习笔记第一章

    Web工作方式类似餐厅点餐,点餐-上菜。这是用户能看到的部分。而服务员接到点餐后,会把菜单拿给厨师,然后厨师做好菜后会给服务员说,然后服务员就拿到做好的菜品就上...

    HACK学习
  • C# 是如何执行的

    为什么 Unity3D 可以运行 C#,C# 和 Mono 是什么关系,Mono 和 .Net Framework 又是什么关系?我们深入的来聊一聊这个话题!

    鹅厂优文
  • 美日巨型机器人大战终于要来了:Megabots首发视频演示火力

    2015年,一个来自美国的机器人工程团队--MegaBots在网上发起了机器人挑战赛众筹。据悉,日本水道桥重工接受了MegaBots发出的巨型机器人挑战。这场世...

    机器人网
  • Mac OS X安装php工作环境

    1.安装Apche Sudo apachectl start 2.开启php支持 sudo vi /etc/apache2/httpd.conf 找到LoadM...

    苦咖啡
  • 基于PyTorch实现MNIST手写字识别

    本篇不涉及模型原理,只是分享下代码。想要了解模型原理的可以去看网上很多大牛的博客。

    Awesome_Tang
  • Intel Selena Ding:‍‍未来可编程交换机的应用

    在2020网络数据平面峰会上,来自英特尔互联部门BXD(barefoot networks)产品线的客户解决方案架构师——Selena Ding,为我们讲述了可...

    SDNLAB
  • mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT...

    yaphetsfang

扫码关注云+社区

领取腾讯云代金券