c++ - 动态转换可以在通用函数中完成而不是重载吗?

标签 c++ inheritance dynamic-cast

我想知道是否不做这样的事情:

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/

相关文章:

c++ - 静态结构链接器错误

c++ - 类型转换问题

clang - 对IR代码中的static_cast和dynamic_cast进行分类

c++ - 为什么 const 模板化引用类型不同于 const 引用类型?

c++ - QJsonObject::insert 与直接赋值给 QJsonValueRef 相比?

c++ - C++中遍历目录和迭代器

c++ - 将指针 vector 作为参数传递

Python 类继承 AttributeError - 为什么?怎么修?

c++ - 存储类列表并通过在 C++ 中进行子类化来专门化函数?

c++ - 多个父类(super class)中的多重继承、C++ 和相同方法签名