用推广make_shared和make_unique的方法复合指针特征类

Compound pointer traits class with method generalizing make_shared and make_unique?

本文关键字:make 复合 方法 指针 特征 shared unique      更新时间:2023-10-16

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

计算机科学中一句著名的格言是,我们要么什么都没有,要么只有一个,要么任意多个。在这种情况下,我们讨论的是复合指针,或者类似指针的对象。除了这两个之外,肯定还有其他的(例如:CUDA相关内存的智能指针(。

嗯,我希望有以下功能:

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;

作为CCD_ 5。这个traits类还有一个元素类型、一个原始指针类型(如果存在的话(等等——类似于迭代器traits类模板std::iterator_traits。它也将存在于普通指针,其制造商将是

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

我能在标准库中找到这种特质类或其等价物吗?我试过了,但失败了。。。如果它不存在,标准委员会是否提出/讨论过类似的建议?

基于@NathanOlliver的见解和建议:

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