我正在尝试在 C++ 中实现一个超类,它将实现一种方法:
-void setValueForKey(void *value, string key);
该方法所要做的就是将与给定键关联的属性的值设置为新值。这在实现自省机制的语言中很容易;据我所知,C++ 没有。
为了做到这一点,我创建了另一种方法:
void registerKeyForProperty(void *propertyPtr, string key);
这个方法所做的只是在内部存储一个指向与给定键关联的属性的指针,因此我的所有子类都会为他们声明的每个属性调用它,并且我将有一种方法可以为属性设置值而无需使用二传手。(这就是我需要的!)(我在帖子末尾解释了原因......)
对于第二个功能,我有以下实现:
void registerKeyForProperty(void *propertyPtr, string key){
_keysDictionary->insert(pair<string,void*>(key,property));
}
其中 _keysDictionary 是一个 stl 映射。
对于第一个,我有以下实现:
void ConstructableObject::setValueForKey(void* value, string key) {
map<string,void *>::iterator it=_keysDictionary->find(key);
if(it==_keysDictionary->end()){return;}//just return if there is nothing for that key
void *property=it->second;
(*property)=value;
}
问题是最后一行不是合法的 C++,因为我当然不能只尊重 void*。
我的问题是:
有没有其他方法可以实现所需的功能?有没有像我这样做的“合法”方式?(我不能简单地使用 reinterpret_cast 因为我不知道要投射到什么......)
为什么这个:
我需要解析包含有关某些对象的一些信息的 xml 文件。我将使用 TinyXML,因此我将拥有对象及其值的属性名称。这就是我想使用它的方式:
MyClass obj();//the constructor would call setValueForKey(...,...) for every property so all are now registered
for every attribute{
obj.setValueForKey(attribute.value,attribute.name);
}
//all properties should be set now