【问题标题】:How to create concrete class from a template class如何从模板类创建具体类
【发布时间】:2014-11-05 00:41:09
【问题描述】:

假设我有一个模板类:

template <typename T> class StringDeque:
public std::deque<T>
{
public:

    ...

private:
    typedef std::deque<T> BaseClass; 
};

假设我想创建具体的类ArrayString 其中T=std::string。 实现这一目标的正确方法是什么:

定义

#define ArrayString StringDeque<string>

typedef

typedef StringDeque < string > ArrayString;

继承

class ArrayString :
    public StringDeque < string > {};

我不确定所有建议是否都有效。无论如何,我正在尝试找出最适合哪种做法。

【问题讨论】:

  • 我认为 typedef 不适用于模板,但你可以说 using ArrayString = StringDeque&lt;std::string&gt;;
  • @Melkon Typedef 适用于类型,类模板的实例化是一种类型,所以它工作得很好。

标签: c++ templates concrete-inheritance


【解决方案1】:

您想为特定类型(恰好是模板的实例化)命名。 C++ 给类型命名(别名)的方法是使用 typedef:

typedef StringDeque<string> ArrayString;

或者,从 C++11 开始,使用别名声明:

using ArrayString = StringDeque<string>;

旁注:在考虑这些内容时,通常根据正确的模板术语进行思考会有所帮助。您没有“模板类”(具有特殊属性的 class),您有“类模板”(用于创建类的 模板)。模板不是类型;它的实例是。

【讨论】:

    【解决方案2】:

    使用typedef 或(C++11 起)using 创建类型别名:

    typedef StringDeque<std::string> ArrayString;
    using ArrayString = StringDeque<std::string>;
    

    预处理器是一把大锤:偶尔有用,但由于不了解语言级结构,容易以令人惊讶的方式破坏代码。在这种情况下,我认为唯一的问题是名称不会被限制在任何范围内;但这足以避免它。

    继承创建一个新类型;虽然它通常可以在基类型所在的地方使用,但它不是完全可互换的,并且不会从基类型继承任何构造函数。所以这也不是你想要的简单类型别名。

    【讨论】:

      【解决方案3】:

      正确方法:

      typedef std::deque<std::string> StringDeque;
      using StringDeque = std::deque<string>;
      

      也就是说,以下是关于您的问题的更多说明:

      你写道:

      template <typename T> class StringDeque: public std::deque<T> // ...
      

      std 容器类并不意味着基类。这意味着它们不应继承自(并且从它们继承的是 UB)。

      当您想在另一个类中使用std 容器功能时,答案应该始终是封装。这意味着,在您的类中构建 std::queue 功能的正确方法是:

      template<typename T> class StringDequeue {
          std::deque<T> storage;
      public:
          // add interface here that uses storage
      };
      

      你也提出了这个:

      #define ArrayString StringDeque<string>
      

      请不要使用define 来声明一个类型。它可以工作,但它有自己的缺陷,在 C++ 中被认为是不好的做法。

      【讨论】:

        猜你喜欢
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多