我想知道是否不做这样的事情:
void attrSetValue(Entity* entity, int index, std::string value)
{
dynamic_cast<stringAttribute*>(entity->attribute[index])->value = value;
}
void attrSetValue(Entity* entity, int index, int value)
{
dynamic_cast<intAttribute*>(entity->attribute[index])->value = value;
}
是否可以编写通用函数来接受传递的任何类型并正确转换以保存数据?像模板一样的东西。我可以看到模板本身是有问题的,看到它在不同类型上没有做同样的事情,尽管它几乎在不同类型上做同样的事情。只是 dynamic_cast 类型发生了变化。为了使问题更简单,是否有一种方法可以通过摆脱重载来简化代码?过载是否会以任何方式影响性能?
稍微解释一下上面发生的事情,看到这只是代码的一小部分,实体的属性可以是任何类型(int、double、string、char、bool 等) - 因此使用带有虚函数的继承来获得具有不同类型的属性值。这些属性被添加到实体结构/类上的 vector 中。例如
std::vector<attribute*> attributes;
最佳答案
看起来你想做类型映射:
template <typename T> struct TypeMap;
template<> struct TypeMap<int> { typedef intAttribute type; };
template<> struct TypeMap<string> { typedef stringAttribute type; };
template <typename ValueT>
void attrSetValue(Entity* entity, int index, ValueT value)
{
dynamic_cast<typename TypeMap<ValueT>::type*>(entity->attribute[index])->value = value;
}
性能将与您的原始代码相同。您可以使用 Boost MPL 以更奇特的方式执行此操作来执行类型映射,但它们的效果是一样的。
关于c++ - 动态转换可以在通用函数中完成而不是重载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23913718/