对于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);
}
我可以在标准库中找到这种特质类吗?我尝试并失败了...如果不存在,标准委员会是否曾提议/讨论过类似的事情?
答案 0 :(得分:0)
基于@NathanOlliver的见解和建议:
标准库有一个std::pointer_traits
类,但是该类没有实际执行分配的函数。向C ++标准委员会提出这个建议可能会很有用,我至少会尽快尝试。如有任何更新,将在此处发布更新。