好的,我们走了.我正在尝试使用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的一部分,但除了使用继承之外,我看不到这样做的方法....
说我上课了
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还是只有一个?