如何将模板化的类放入列表并保存类型

时间:2013-11-18 13:16:45

标签: c++

如果我有以下课程:

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);

2 个答案:

答案 0 :(得分:2)

这一行不会编译:

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

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

答案 1 :(得分:0)

您可能需要为所有转换器定义基类,并让模板转换器从您的基类派生。

大多数时候,界面都可以提供帮助。