2017-04-16 87 views
2

我目前正在研究一个项目,该项目需要我有一个向量存储指向同一类但具有不同模板值的对象的指针。我想用shared_ptrs的,我不会太深入到(主要是,如果我想共享两个ColumnLists之间的列)的原因。将shared_ptr <void>投射到shared_ptr时的行为智能指针<type>

我需要能够从一个函数返回一个指针铸造(如下图所示)。

所以这是一个非常简化的版本:

template <typename ColType> 
class Column { 
    std::vector<ColType>; 
}; 

template <typename ...TypesOfColumns> 
class ColumnList { 

private: 
    std::vector< std::shared_ptr<void> > columnsVector; 
    /* Needs to have a vector storing pointers to multiple Columns 
     all with different template values */ 

public: 
    template <typename ReturnType> std::shared_ptr<ReturnType> GetPointer(int index) 
    { 
     return std::static_pointer_cast<ReturnType>(columnsVector.at(index)); 
    }; 

}; 

我,如果我得到某种类型的这里未定义行为不知道?它会工作,因为我希望:将返回铸造类型只需添加一个到虚拟指针的强参考计数器?一个可以在另一个之前被删除吗?我冒着内存泄漏的风险,其中一个被删除,另一个没有(我怀疑这是一个例子)?

一如往常,感谢所有的帮助!

+0

[codereview.se] – cpplearner

+0

@cpplearner我不同意。 “这个代码有效,我可以做得更好”适合于CR。 “这段代码似乎有用,但它真的”不是。 – Quentin

回答

2

static_pointer_cast遵循的static_cast做同样的规则。是合法的一个指针到基部向下转换到一个指针到衍生只要derivedbase导出。只要你确信columnsVector.at(index)包含shared_ptr<ReturnType>(即,包含shared_ptr<void>起源为shared_ptr<ReturnType>),你在做什么是合法的。如果你不确定,你应该使用dynamic_pointer_cast。

此外,关于记忆,static_pointer_cast股输出相同的底层控制块作为输入,因此它是安全的这样了。即使输入要先被删除,输出仍然是共享资源的合法所有者,反之亦然。

+0

太棒了,第二张图真的很有帮助!非常感谢! –

2

IMO好得多将具有抽象列作为基类为模板:

struct AbstractColumn { 
    virtual ~AbstractColumn() {} 
    ... 
}; 

template<typename Type> 
struct Column : AbstractColumn { 
    std::vector<Type> data; 
}; 

这将提供一个地方,把通用的方法(例如转化成字符串,从字符串等解析)也将允许您使用指针的基类,而不是指针到void

+1

我会明确地移动(或至少增加)虚拟析构函数'AbstractColumn' – Zereges

+0

@Zereges:其实它的意思是确实存在的,固定。 – 6502

相关问题