【问题标题】:Creating a type alias for a templated class为模板类创建类型别名
【发布时间】:2009-02-13 05:34:11
【问题描述】:

而不是使用

std::vector<Object> ObjectArray;

我希望是这样的

MyArray<Object> ObjectArray;

保留所有 std::vector 方法。 (如 push_back()、reserve()、...等)

但是,使用

typedef std::vector MyArray;

行不通。我应该改用模板吗?怎么样?

【问题讨论】:

  • 您能否详细说明为什么您想要这个?
  • @Eydne,如果他想在不破坏现有代码的情况下将 MyArray 更改为 std::list 怎么办?

标签: c++


【解决方案1】:

你真正想要的是一个模板化的 typedef。不幸的是,当前版本的 C++ 不支持这些,但它们将在 C++0x 中添加。

目前,这里有一个可能的解决方法:

template<class T> struct My {
    typedef std::vector<T> Array;
};

My<Object>::Array ObjectArray

这是否比直接使用std::vector更好,由您决定。

【讨论】:

  • Greg,感谢您修复我的语法。你能说我最近一直在使用很多 Java 吗? ;)
【解决方案2】:

从 C++11 开始,您可以使用模板化类型别名

template <typename T>
using MyArray = std::vector<T>;

如果您想更通用,可以使用可变参数模板(在向量的情况下允许分配器而不必具体)

template <typename... Ts>
using MyArray = std::vector<Ts...>;

【讨论】:

    【解决方案3】:

    另一种方式:

    #include <vector>
    
    template <typename T>
    struct MyArray
        :std::vector<T>
    {
    };
    
    void func()
    {
        MyArray<int> my;
    
        my.push_back(5);
    
        MyArray<int>::iterator i;
    }
    

    为我编译,但你可能会发现有些东西 vector 中的可用需要“上拉” 进入 MyArray。

    【讨论】:

    • 这可能是个坏主意:std::vector 没有虚拟析构函数。如果您需要向 MyArray 添加析构函数,它可能不会被调用。
    • 另一个问题是MyArray&lt;T&gt;std::vector&lt;T&gt;是不同的类型,重载解析对于这两个example会有不同的表现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2020-02-04
    相关资源
    最近更新 更多