templates - 如何 typedef 包装模板类的智能指针

标签 templates c++11 typedef smart-pointers

如何输入 std::unique_ptr<T> ,其中T是一个模板类Object<U>

我有一个模板类,Object.h:

    template<typename T>
    class Object
    {
    public:
       Object()                      {}
       ~Object()                     {}

       T getValue()                  { return value_; }
       void setValue(T value)        { value_ = value; }

    private:
       T value_;
    }

另一个名为 Holder 的类,它保存一个包裹在智能指针中的对象,std::unique_ptr<Object<T>> ,在容器中:

    template<typename T>
    class Holder
    {
    public:
       Holder()                      {}
       ~Holder()                     {}

    private:
       std::vector<std::unique_ptr<Object<T>>> objects_;
    }

我总是使用 typedef 来引用智能指针中包装的对象,因此我将以下 typedef 放入类定义中:

    template<typename T>
    class Holder
    {
       typedef std::unique_ptr<Object<T>> ObjectPtr; // - (1)
      // using  ObjectPtr = std::unique_ptr<T, Object<T>> - (2) alias template - same error as above
      // typedef std::unique_ptr<Object<T>> ObjectPtr<T> - not allowed
      // ..

     private:
        std::vector<ObjectPtr<T>> objects_;

但是,改变成员变量objects_的类型至ObjectPtr<T>导致编译器错误 C2947: expecting ´>´ to terminate template-argument-list, found ´<´

正确的方法是什么?

最佳答案

如果我对您想要实现的目标是正确的,解决方案是声明 alias template :

template<typename T>
class Holder
{
public:
    template<typename U>
    using ObjectPtr = std::unique_ptr<Object<U>>;

    void add_objet(ObjectPtr<T> newObject)
    { objects_.emplace_back(std::move(newObject)); }

private:
    std::vector<ObjectPtr<T>> objects_;
};

int main()
{
    Holder<int> holder;
    holder.add_objet( make_unique<Object<int>>() );
}

编辑

因为我的解决方案在主模板中定义了一个内部模板,所以它有点矫枉过正,而且有点麻烦:在主模板中,每次使用 ObjectPtr 都必须由 T 参数化。请参阅下面其他贡献者提出的基于 typedef 的解决方案,了解更简单的解决方案。

关于templates - 如何 typedef 包装模板类的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33321323/

相关文章:

c++ - 自身内部模板化类的 Typedef

c - typedef 指针常量怪异

c++ - 模板偏特化

c++ - 模板特化别名

c++ - lambda 队列是 C++11 中工作队列的良好设计模式吗?

c++ - 嵌套结构初始化

c++ - 有没有办法通过引用模拟向下转换

c++ - 如何专门化模板包?

c++ - 三元运算符优先级和赋值

java - C++ 中的 typedef 关键字是否有 Java 等效项或方法?