小编mbr*_*0wn的帖子

为什么'纯多态性'优于使用RTTI?

我见过的几乎所有C++资源都讨论过这种事情告诉我,我应该更喜欢使用RTTI(运行时类型识别)的多态方法.总的来说,我认真对待这种建议,并会尝试理解其基本原理 - 毕竟,C++是一个强大的野兽,并且很难全面理解.然而,对于这个特殊的问题,我正在画一个空白,并希望看到互联网可以提供什么样的建议.首先,让我总结一下到目前为止我所学到的内容,列出引用为什么RTTI被"认为有害"的常见原因:

有些编译器不使用它/ RTTI并不总是启用

我真的不买这个论点.这就像是说我不应该使用C++ 14的功能,因为有些编译器不支持它.然而,没有人会阻止我使用C++ 14功能.大多数项目将对他们正在使用的编译器以及它的配置方式产生影响.甚至引用gcc手册页:

-fno-rtti

禁止使用虚拟函数生成有关每个类的信息,以供C++运行时类型标识功能(dynamic_cast和typeid)使用.如果您不使用该语言的那些部分,则可以使用此标志来节省一些空间.请注意,异常处理使用相同的信息,但G ++会根据需要生成它.dynamic_cast运算符仍可用于不需要运行时类型信息的强制类型转换,即强制转换为"void*"或转换为明确的基类.

这告诉我的是,如果我不使用RTTI,我可以禁用它.这就像说,如果你没有使用Boost,你就不必链接到它.我没有计划有人正在编译的情况-fno-rtti.此外,在这种情况下,编译器将失败并且清晰.

它需要额外的内存/可能很慢

每当我想要使用RTTI时,这意味着我需要访问我班级的某种类型信息或特征.如果我实现了一个不使用RTTI的解决方案,这通常意味着我将不得不在我的类中添加一些字段来存储这些信息,因此内存参数有点无效(我将进一步说明这一点).

事实上,dynamic_cast可能很慢.但是,通常有办法避免使用速度危急情况.而且我没有看到替代方案.这个SO答案建议使用在基类中定义的枚举来存储类型.这只有在您了解所有派生类时才有效.这是一个非常大的"如果"!

从这个答案来看,RTTI的成本似乎也不清楚.不同的人衡量不同的东西.

优雅的多态设计将使RTTI变得不必要

这是我认真对待的建议.在这种情况下,我根本无法提出覆盖我的RTTI用例的良好的非RTTI解决方案.让我举一个例子:

假设我正在编写一个库来处理某种对象的图形.我想允许用户在使用我的库时生成自己的类型(因此enum方法不可用).我的节点有一个基类:

class node_base
{
  public:
    node_base();
    virtual ~node_base();

    std::vector< std::shared_ptr<node_base> > get_adjacent_nodes();
};
Run Code Online (Sandbox Code Playgroud)

现在,我的节点可以是不同类型的.这些怎么样:

class red_node : virtual public node_base
{
  public:
    red_node();
    virtual ~red_node();

    void get_redness();
};

class yellow_node : virtual public node_base
{
  public:
    yellow_node();
    virtual ~yellow_node();

    void set_yellowness(int);
};
Run Code Online (Sandbox Code Playgroud)

见鬼,为什么不是其中之一:

class orange_node : public red_node, public yellow_node
{
  public:
    orange_node();
    virtual ~orange_node();

    void …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism rtti

104
推荐指数
6
解决办法
7175
查看次数

如何在不指定后者的情况下将本地分支重置为远程跟踪分支?

如果我有一个本地分支和一个不同步的远程分支,可以通过运行将本地分支重置为远程状态

$ git reset --hard origin/foo
Run Code Online (Sandbox Code Playgroud)

但是,有些情况下这是不实用的,特别是如果我运行的脚本需要重置我当前检出的任何分支到远程状态(我现在在Jenkins脚本中有这个问题).

我需要的是一个命令,它"找出远程跟踪分支并将本地分支重置为任何东西".我们假设总有一个远程跟踪分支.

简单地应用'origin'是行不通的,因为我有多个遥控器.我得到的最接近的是

git reset --hard `git branch -vv | grep "^*" | grep -P -o "(?<=\[).*(?=\])"`
Run Code Online (Sandbox Code Playgroud)

......但这看起来很愚蠢,鉴于git的百万命令,必须有一个更简单的方法.

git jenkins

4
推荐指数
1
解决办法
510
查看次数

标签 统计

c++ ×1

git ×1

jenkins ×1

polymorphism ×1

rtti ×1