代码之家  ›  专栏  ›  技术社区  ›  casualcoder

C++中是否存在多态性的替代方案?

  •  8
  • casualcoder  · 技术社区  · 17 年前

    The CRTP hinted at here. 即使是2.5倍的加速也太棒了。

    所讨论的类很简单,可以完全内联编码,但是直到运行时才知道将使用哪些类。此外,他们可能会以任何顺序被锁链锁住,将绩效侮辱堆积在伤害之上。

    欢迎提出任何建议(包括在这种情况下如何使用CRTP)。

    编辑: 谷歌搜索中提到了函数模板。这些看起来很有希望。

    3 回复  |  直到 9 年前
        1
  •  21
  •   Community Mohan Dere    9 年前

    1. AdHoc多态性:这是C++中最好的函数和方法重载。相同的函数名将根据匹配的函数名绑定到不同的方法 函数或方法签名调用的参数类型。
    2. 参数多态性:在C++中,这是模板和所有可以用它做的有趣的事情,例如CRTP、专业化、部分专业化、元编程等等。同样的多态性,其中相同的模板名称可以根据模板参数做不同的事情。 编译时 多态性。
    3. 子类型多态性:最后,当我们在C++中听到单词多态时,我们会想到这一点。这是派生类重写虚拟函数以专门化行为的地方。根据基类所指向的具体派生类型,指向基类的同一类型指针可以具有不同的行为。这是获得成功的途径 运行时

    如果直到运行时才知道将使用哪些类,则必须使用涉及虚拟函数调用的子类型多态性。

    与静态绑定调用相比,虚拟方法调用的性能开销非常小。我劝你看看这个问题的答案 SO question.

        2
  •  3
  •   timday    17 年前

    我同意m-sharp的观点,即您不会避免运行时多态性。

    如果你看重的是优化而不是优雅,试着换一种说法

    void invoke_trivial_on_all(const std::vector<Base*>& v)
    {
      for (int i=0;i<v.size();i++)
        v[i]->trivial_virtual_method();
    }
    

    void invoke_trivial_on_all(const std::vector<Base*>& v)
    {
      for (int i=0;i<v.size();i++)
      {
        if (v[i]->tag==FooTag)
          static_cast<Foo*>(v[i])->Foo::trivial_virtual_method();
        else if (v[i]->tag==BarTag)
          static_cast<Bar*>(v[i])->Bar::trivial_virtual_method();
        else...
      }
    }
    

    它并不漂亮,当然也不是OOP(更像是对旧的“C”的回归),但是如果虚拟方法足够简单,那么应该得到一个不需要调用的函数(取决于足够好的编译器和优化选项)。使用dynamic_cast或typeid的变体可能更优雅/安全,但请注意,这些特性有其自身的开销,这可能与虚拟调用相当。

    您最有可能从上面看到改进的地方是,如果某些类方法不是ops,并且它使您免于调用它们,或者如果函数包含公共循环不变代码,并且Optimizer成功地将其从循环中提升出来。

        3
  •  0
  •   Paul Nathan    17 年前

    您可以使用Ole C路径并使用联合。虽然这也会很混乱。