gpt4 book ai didi

c++ - 如何指定其类被模板化的成员变量(组合)

转载 作者:行者123 更新时间:2023-11-28 07:52:58 25 4
gpt4 key购买 nike

下面的类 HandleMessages 有一个 ProtocolDecoder* 类型的成员变量。当 ProtocolDecoder 不是模板类时,这很好。现在我已经变成这样了,但是现在代码无法编译。

在运行时,有一个工厂函数可以创建所需的解码器。

如果我不能有一个成员 m_Decoder 那么我怎样才能达到同样的效果呢?

如果我尝试将成员声明为 ProtocolDecoder* m_Decoder;

我收到编译器错误:错误 C2059:语法错误:“<”

并查看对正在编译的类模板实例化“LogPlayer”的引用

template <typename T>
class ProtocolDecoder
{
public:
virtual const char* ProtocolName() = 0;
virtual ProtoWrapper<T>* DecodeMsg(const unsigned char* msg, int length) = 0;
...
};

class ABCDecoder : public ProtocolDecoder<ABC_msg>
{
public:
virtual const char* ProtocolName() {return "ABC"; }

virtual ProtoWrapper<ABC_msg>* DecodeMsg(const unsigned char* msg, int length);
};

//lots of different decoders derived from ProtocolHandler

class HandleMessages
{
public:
void Process() {}

private:
//ProtocolDecoder<T>* m_Decoder; //Want a Protocol member variable - but don't know type until runtime
};

最佳答案

如果不指定模板参数就不能使用模板对象,模板类型只有在所有参数都有值时才存在。

所以 ProtocolDecoder<int>*是实型,ProtocolDecoder<T>*不是。您在这里可能想要的是创建一个所有模板类都派生自的抽象基类。然后您可以简单地将它们向上转换为基本类型并以这种方式存储它们。

例如,

class BaseProtocolDecoder 
{
public:
virtual const char* ProtocolName() = 0;
virtual BaseProtoWrapper* DecodeMsg(const unsigned char* msg, int length) = 0;
...
};

template <typename T>
class ProtocolDecoder : BaseProtocolDecoder
{
public:
const char* ProtocolName();
BaseProtoWrapper* DecodeMsg(const unsigned char* msg, int length);
...
};

template<>
ProtocolDecoder<ABC_msg>
{
public:
const char* ProtocolName() {return "ABC"; }

BaseProtoWrapper* DecodeMsg(const unsigned char* msg, int length);
};

您需要为 ProtoWrapper<T> 做同样的事情, 同理

注意:通常你会想要放弃模板并简单地使用继承,因为模板最终并不是绝对必要的。当然,这取决于具体情况,但偶尔查看模板代码并思考“我可以撕掉模板吗?”总是好的。

关于c++ - 如何指定其类被模板化的成员变量(组合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348734/

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