相关疑难解决方法(0)

C++ - &CRTP.类型擦除vs多态

好的,我们走了.我正在尝试使用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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

然而,在我看来,如果我想这样做,我将不得不在SuperBase中使doSomething虚拟化.我的目标主要是没有vtable.

第二种方法:我使用类型擦除,即boost :: any之类的东西将我的元素存储在Vector中.但是,我没有看到我可以迭代元素并在它们上调用doSomething的方法,因为要"使用"boost :: any,我需要在迭代时知道对象的真实类型.

你认为我想要做的甚至是可能的吗?

在我看来,这是因为doSomething()是Base的一部分,但除了使用继承之外,我看不到这样做的方法....

c++ metaprogramming type-erasure

8
推荐指数
2
解决办法
2575
查看次数

具有不同实例化的静态模板类变量是否相同?

说我上课了

template <typename T>
class MyClass
{
    static int myvar;
}
Run Code Online (Sandbox Code Playgroud)

现在,以下任务将会发生什么?

MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
Run Code Online (Sandbox Code Playgroud)

根据标准会发生什么?我会有两个版本的MyClass :: myvar还是只有一个?

c++ static templates static-members

6
推荐指数
2
解决办法
195
查看次数