【发布时间】:2020-09-29 04:37:30
【问题描述】:
我有一个像这样的 C++ 对象类:
class Component {};
template <typename T>
concept component = std::is_base_of_v<Component, T>;
class Object
{
std::map<std::type_index, Component*> components;
public:
template<component T>
T* add()
{
if(components.find(typeid(T)) == components.cend())
{
T* value{new T{}};
components[typeid(T)] = static_cast<Component*>(value);
}
}
template<component T, typename... Args>
T* add(Args &&... args)
{
if(components.find(typeid(T)) == components.cend())
{
T* value{new T{std::forward<Args>(args)...}};
components[typeid(T)] = static_cast<Component*>(value);
}
}
};
添加到class Object 的Components 在另一个与我的问题无关的函数上是deleted。 AFAIK 做很多 new/delete 调用(堆分配)会损害性能,并且应该有 20/30(甚至更多)Objectss,每个调用 3-10 个 Object::add。我以为我可以在没有new 的情况下调用T-s 构造函数,然后调用static_cast<Component*>(&value),但是添加到地图上的组件是“无效的”,这意味着所有T 的成员(例如在具有一些@987654332 的类上@ 成员,它们都等于 0 而不是传递给其构造函数的一些自定义值)。我知道value 超出范围并且map 上的指针变成了一个悬空的指针,但是我找不到在不调用new 或不将它们声明为@987654338 的情况下实例化T 对象的方法@。有没有办法做到这一点?
编辑:如果我将value 声明为static,一切都会按预期进行,所以我猜这是与value 相关的终身问题。
【问题讨论】:
-
您能解释一下您要解决的根本问题吗?
-
对不起,我的错。我正在尝试删除那些
new/delete调用,但正如@Olaf Dietsche 所提到的,如果我编写他共享的sn-p,value变量将超出范围,components映射将包含悬空指针.如果我将value声明为static,它将使程序的生命周期和问题得到解决,但我想找到一种更便宜的方法来创建Ts 并将它们存储在components地图上(除了使用new/static).
标签: c++ visual-studio templates variadic-templates