gpt4 book ai didi

c++ - 如何将模板化类放入列表并保存类型

转载 作者:行者123 更新时间:2023-11-28 03:04:31 26 4
gpt4 key购买 nike

如果我有以下类(class):

class Animal {
...
int GetSize() const { return _size; }
void SetSize(int size) { _size = size; }
...
private:
int _size;
};

然后我创建了一个 Converter 类,可以这样调用:

Animal* elephant = new Animal(...);
Converter* c = new Converter<Animal, int>(&Animal::GetSize, &Animal::SetSize);
c->Set(elephant, "50");

假设转换器模板类需要对象的类型和我们要传递给它的字段的类型。

这不是什么大问题,您只需将字符串转换回原始类型并调用 setter 即可:

template <typename ObjectType, typename ValueType>
class Converter {
...
void Set(ObjectType* obj, ValueType value) {
std::stringstream ss(value);
T newValue;
ss >> newValue;
(obj->*_setter)(newValue);
}
...
typedef void (ObjectType::*SetterType)(ValueType);
SetterType setter;
...
};

问题是将这些转换器类放入某种容器中。也许是这样的:

std::map<std::string, Converter*> fields;
fields["size"] = new Converter<Animal, int>(&Animal::GetSize, &Animal::SetSize);

首先想到了一个抽象基类,但是你无法从基类中取出原始类型,这意味着你无法进行字符串转换。

任何想法将不胜感激。

编辑:

稍微澄清一下。这个想法是创建一个包含不同类型转换器的映射,如下所示:

fields["size"] = new Converter<Animal, int>(&Animal::GetSize, &Animal::SetSize);
fields["growth"] = new Converter<Animal, double>(&Animal::GetGrowth, &Animal::SetGrowth);

最佳答案

这一行不会编译:

Converter* c = new Converter<Animal, int>(&Animal::GetSize, &Animal::SetSize);

问题是 Converter*不是有效类型。 Converter<Animal, int>*是。如果不指定模板参数,则无法创建指针。这也解决了您的其他问题 - 您不必以任何其他方式存储类型,而是以指针的类型存储类型。

关于c++ - 如何将模板化类放入列表并保存类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20048757/

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