C++ -& CRTP 。类型删除与多态性

标签 c++ metaprogramming type-erasure

好的,我们开始吧。我正在尝试使用 CRTP模板,以便从我的应用程序中删除多态性的需要。我使用像下面这样的方法

template <RealType> class Base 
{

    void doSomething()
    {
         static_cast<RealType>(this)->doSomethingImpl()
    }

class Derived1 : public Base
{
    void doSomethingImpl()
    {
        /* do something, for real */
    }
}

class Derived2 : public Base
{
    void doSomethingImpl()
    {
        /* do something else */
    }
}

如果我理解正确的话,这种方法允许我的类没有 vtable,所以函数调用是直接的,不需要额外的间接访问。

现在假设我想将所有 Derived# 类存储在一个容器中。让我们说一个 vector 。

第一种方法:我可以创建一个非模板 SuperBase 类,Base 从该类继承并将其存储在容器中。

但是在我看来,如果我想这样做,我将不得不在 SuperBase 中将 doSomething 设为虚拟。而我的目标主要是不要vtable。

第二种方法:我使用类型删除,即像 boost::any 这样的东西将我的元素存储在 Vector 中。 但是,我没有看到一种方法可以遍历元素并对它们调用 doSomething,因为要“使用”boost::any,我需要在遍历时知道对象的真实类型。

你觉得我想做的事有可能吗?

在我看来,这是因为 doSomething() 是 Base 的一部分,但除了使用继承,我看不出有什么方法可以做到这一点....

最佳答案

And my goal is mainly not to have a vtable.

如果你想要这个,那么,除非你实现自己的虚拟调度系统(这可能不如编译器所做的),否则你只能使用模板,也就是编译时多态性。顾名思义,为了使用它,编译时必须知道所有内容。如果您需要根据运行时事件(例如用户输入)做出决策,您需要运行时多态性

我不禁要问:为什么您要避免 vtables? (如果您下定决心,为什么不用 C 语言编程呢?)

关于C++ -& CRTP 。类型删除与多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4316317/

相关文章:

c++ - 我能否始终安全地转换为固定(作用域)枚举的基础类型?

c++ - vector 的算术运算

c++ - 为什么map在(switch)格外变成空的?

groovy - metaClass.methods 和 metaClass.metaMethods 有什么区别?

c++ - SIFT 算法中的奇怪 Octave 值?

c++ - 专门化变量的值在编译时是否已知/未知

Ruby 模板模块

ios - 如何将类型删除与使用关联类型的协议(protocol)一起使用

java - 在运行时获取属性类型

generics - 使用 Jackson 序列化 Map<Date, String>