gpt4 book ai didi

c++ - 如果我创建一个模板类,那么我向该类发送引用(指针)的其他类必须被模板化吗?

转载 作者:行者123 更新时间:2023-11-30 01:08:35 26 4
gpt4 key购买 nike

假设我有 this code使用 EnvelopeMultiPoints 类 template :

#include <iostream>
#include <vector>

class EnvelopeMultiPointsBase
{
// base
};

template<class T>
class EnvelopeMultiPoints : public EnvelopeMultiPointsBase
{
public:
static unsigned int mNumPoints;

EnvelopeMultiPoints() { }
~EnvelopeMultiPoints() { }

void Process() {
std::cout << "process: " << mNumPoints << std::endl;
}
};

class Pitch : public EnvelopeMultiPoints<Pitch> { };

template<typename T>
unsigned int EnvelopeMultiPoints<T>::mNumPoints = 5;

class Container
{
public:
EnvelopeMultiPointsBase *pAssociatedEnvelope;

Container(EnvelopeMultiPointsBase *associatedEnvelope) : pAssociatedEnvelope(associatedEnvelope) { }
~Container() { }

void Process();

private:
};

int main()
{
EnvelopeMultiPoints<Pitch> pitch;
Container container(&pitch);
container.pAssociatedEnvelope->Process();
}

我想传递给 Container任何类型的“EnvelopeMultiPoints”类型(通用“指针”),所以稍后我可以访问它自己的方法(在我的例子中,Process())。

是不是也意味着Container必须是 templated ? (这在我的真实场景中是巨大的;在模板中转换其所有方法、翻译 header /cpp 等的大量工作)。

或者我缺少什么技巧?

简而言之:假设我想传递给 Container EnvelopeMultiPoints<Pitch> ,然后执行 Process() .后来想传EnvelopeMultiPoints<Volume>相反,而不是执行 Process() .等等。有没有办法在不转换的情况下做到这一点 Container到模板?

最佳答案

你需要的技术叫做dynamic polymorphismvirtual functions 在 C++ 中实现.

说明如何使用您的代码:

class EnvelopeMultiPointsBase
{
public:

// Abstract base, no actual implementation
virtual void Process() = 0;
};

template<class T>
class EnvelopeMultiPoints : public EnvelopeMultiPointsBase
{
public:
static unsigned int mNumPoints;

EnvelopeMultiPoints() { }
~EnvelopeMultiPoints() { }

// Some specific implementation.
virtual void Process() override
{
std::cout << "process: " << mNumPoints << std::endl;
}
};

class Pitch : public EnvelopeMultiPoints<Pitch>
{
};

关于c++ - 如果我创建一个模板类,那么我向该类发送引用(指针)的其他类必须被模板化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com