【问题标题】:Compound pointer traits class with method generalizing make_shared and make_unique?具有泛化make_shared和make_unique方法的复合指针特征类?
【发布时间】:2018-07-24 19:51:24
【问题描述】:

对于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&lt;std::shared_ptr&lt;T&gt;&gt;::make()。而且这个特征类也有一个元素类型、一个原始指针类型(如果存在的话)等等——类似于迭代器特征类模板std::iterator_traits。它也适用于普通指针,其制造商将是

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

我可以在标准库中找到这种类型的特征类或其等价物吗?我尝试过但失败了...如果不存在,标准委员会是否提出/讨论过类似的东西?

【问题讨论】:

  • 这听起来更像是你想要一个分配器,而不是一个特征。一个特征应该只为一个类型的特征提供不同的类型。
  • @NathanOliver:它不是标准库分配器,如果这就是你的意思......
  • 不,不是标准分配器,而是 maker 函数不跟随特征类。例如std::pointer_traits 没有提供创建指针的方法,它只是定义了有关它的内容。
  • 你知道吗,它可能应该。我刚刚查看了allocator_traits,它内置了分配器功能。看起来您可能想要提交提案。
  • 当然,你可以定义这种东西,但为什么呢?也就是说,你有一个励志的例子吗?我可能想在哪种通用算法中创建一个对象并拥有一个指向该对象的类似指针的东西[在此处插入语义]?

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


【解决方案1】:

基于@NathanOlliver 的见解和建议:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多