C++ 对于管理指向不同类型指针的类,最直观的布局是什么?

C++ 对于管理指向不同类型指针的类,最直观的布局是什么?,c++,C++,我有一个类可以管理字符串和指针的映射: class DebugTab { public: void pushItem(std::string&& name, std::unique_ptr<DebugItem> item); private: std::map<std::string, std::unique_ptr<DebugItem>> items_; }; 然后为基本类型创建了几个派生类: class DebugInt

我有一个类可以管理字符串和指针的映射:

class DebugTab
{
public:
    void pushItem(std::string&& name, std::unique_ptr<DebugItem> item);
private:
    std::map<std::string, std::unique_ptr<DebugItem>> items_;
};
然后为基本类型创建了几个派生类:

class DebugInt : public DebugItem
{
public:
    DebugInt(int& i) : i_(i) {}
    std::string asString() override {return std::to_string(i_);}
private:
    int& i_;
};

class DebugFloat : public DebugItem
{
public:
    DebugFloat(float& f) : f_(f) {}
    std::string asString() override {return std::to_string(f_);}
private:
    float& f_;
};

class DebugString : public DebugItem
{
public:
    DebugString(std::string& s) : s_(s) {}
    std::string asString() override {return s_;}
private:
    std::string& s_;
};
我的想法是,使用
DebugTab
的人将使用“new”在堆上创建具有正确类的项,然后将指针传递到
pushItem
,如下所示:

DebugTab tab;

int var1;
float var2;
std::string var3;

tab.pushItem("var1", std::move(std::make_unqiue<DebugInt>(var1)));
tab.pushItem("var2", std::move(std::make_unique<DebugFloat>(var2)));
tab.pushItem("var3", std::move(std::make_unique<DebugString>(var3)));
DebugTab;
int-var1;
浮动变量2;
std::string var3;
tab.pushItem(“var1”,std::move(std::make_unqiue(var1));
tab.pushItem(“var2”,std::move(std::make_unique(var2));
tab.pushItem(“var3”,std::move(std::make_unique(var3));
我对这个解决方案不是很满意。我觉得将堆指针传递给跟踪已创建变量的类不是很直观


有没有更好、更简单的方法来完成所有这些,或者我现在拥有的系统足够了?

好吧,从技术上讲,您可以跳过在callsite分配它们

模板
struct DebugConcrete:DebugItem{
T&T;
std::string asSring()常量重写{
返回std::to_字符串(t);
}
};
类调试选项卡{
模板
void pushItem(标准::字符串名称、T和item){
物品放置(标准::移动(名称),
标准::使_唯一(项目));
}
};
#定义pushItem(…)pushItem(#u VA_ARGS_uu,u VA_ARGS_u)
int main(){
int i;
调试选项卡;
表1第(一)项;
}

“指针应该能够指向不同的类型”。。。为什么?此外,谁在管理此地图接收的
唯一\u ptr
?地图的值类型不是唯一的,因此必须有人持有该对象的所有权,是吗?@NicolBolas地图的值类型是原始指针不是有意的,我现在已经修复了它。至于你的另一个问题,我应该用不同的措辞。很明显,地图中的指针不能指向不同的类型,我的意思是,我需要能够使用指针引用不同的类型。如果不知道这些类型是如何使用的,就很难有意见。但是,
std::variant
可能值得在这里查看并将调试项存储为第一类值。既然基类只有asString,为什么不只拥有字符串映射(因为您将无法从基类访问包含的int、float等)?否则,从您的基类创建一个模板派生类。DebugString是否会在DebugBase中没有虚拟析构函数的情况下泄漏?tab.pushItem(i)是否应该先有一个字符串参数?@DS_London不应该,至少不是这个。啊,现在我明白了…谢谢!只有几个问题:1。DebugTab类定义下的行做什么?我不太熟悉define语句。2.你怎么用一个参数调用pushItem,你不是把它定义为两个参数吗?3.我该如何处理字符串,因为to_字符串没有字符串重载?1。实际上允许2.:使用
pushItem
定义
d,
tab.pushItem(i)
最终扩展为
tab.pushItem(“i”,i)
。对于3,您需要定义一个显式的专门化
template struct DebugConcrete
DebugTab tab;

int var1;
float var2;
std::string var3;

tab.pushItem("var1", std::move(std::make_unqiue<DebugInt>(var1)));
tab.pushItem("var2", std::move(std::make_unique<DebugFloat>(var2)));
tab.pushItem("var3", std::move(std::make_unique<DebugString>(var3)));