如果我有以下课程:
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);
答案 0 :(得分:2)
这一行不会编译:
Converter* c = new Converter<Animal, int>(&Animal::GetSize, &Animal::SetSize);
问题是Converter*
不是有效类型。 Converter<Animal, int>*
是。如果不指定模板参数,则无法创建指针。这也解决了您的另一个问题 - 您不必以任何其他方式存储类型,而是指针类型。
答案 1 :(得分:0)
您可能需要为所有转换器定义基类,并让模板转换器从您的基类派生。
大多数时候,界面都可以提供帮助。