具有通用化make_shared和make_unique方法的复合指针特征类?

时间:2018-07-24 19:51:24

标签: c++ shared-ptr smart-pointers unique-ptr c++-standard-library

对于std::unique_ptr<T>,我们有std::make_unique<T[]>();
对于std::shared_ptr<T>,有std::make_shared<T[]>()

计算机科学中一种众所周知的格言是,我们要么一无所有,要么一无所有,要么任意多。好吧,在这种情况下,我们谈论的是复合指针或类似指针的对象。当然,除了这两个之外,肯定还有其他人(例如:smart pointers for CUDA-related memory)。

好吧,我希望它具有以下功能:

template <typename Ptr>
inline Ptr make(size_t count);

template <typename T, class Deleter = std::default_delete<T>>
inline std::unique_ptr<T[], Deleter> make<std::unique_ptr<T, Deleter>>(size_t count)
{
    return std::make_unique<T[]>(count);
}

template <typename T>
inline std::shared_ptr<T[]> make<std::shared_ptr<T[]>>(size_t count)
{
    return std::make_shared<T[]>(count);
}  

但在特征类中,例如

template <typename Ptr>
struct pointer_traits;

pointer_traits<std::shared_ptr<T>>::make()。并且此traits类还将具有元素类型,原始指针类型(如果存在)等。与迭代器traits类模板std::iterator_traits类似。对于普通的指针也将存在,其制造者将是

template <typename T>
inline T* make<T*>(size_t count)
{
    return new T[](count);
}  

我可以在标准库中找到这种特质类吗?我尝试并失败了...如果不存在,标准委员会是否曾提议/讨论过类似的事情?

1 个答案:

答案 0 :(得分:0)

基于@NathanOlliver的见解和建议:

标准库有一个std::pointer_traits类,但是该类没有实际执行分配的函数。向C ++标准委员会提出这个建议可能会很有用,我至少会尽快尝试。如有任何更新,将在此处发布更新。