【问题标题】:encapsulate C++ templates封装 C++ 模板
【发布时间】:2020-02-08 16:07:34
【问题描述】:

我尝试使用明确的模板规范来实现模板。模板及其实现如下所示:

template <typename T>
class MyClass {
private:
    T data;
    size_t size;

public:
    MyClass();
    ~MyClass();

    uint32_t getSize();

    T getData();
    void setData(T value);
};
template <class T>
MyClass<T>::MyClass()
{
    size = sizeof(T);
}
template <>
MyClass<std::string>::MyClass()
{ 
    size = 0;
}

/* and so on */

当我的显式声明还包含一个类模板时,我遇到了一个问题。比方说,我会创建一个向量的显式模板特化(包含任何基本类型,如 int、char、float 等)并将元素站点存储在 size 变量中。

template <??>
MyClass<std::vector<?>>::MyClass()
{ 
    size = sizeof(?);
}

我该怎么做?

【问题讨论】:

  • 题外话:尽可能使用初始化列表并避免在构造函数体内进行初始化;所以,在你的情况下,template &lt;class T&gt; MyClass&lt;T&gt;::MyClass() : size{sizeof(T)} {}
  • 哦,感谢您的意见。是的,将它们放入初始化列表是有意义的。我在以下位置找到了更多信息:stackoverflow.com/questions/9903248/…

标签: c++ templates c++14


【解决方案1】:

你应该专门化类,而不是方法:

#include <string>
#include <vector>

template <typename T>
class MyClass {
private:
    T data;
    size_t size;

public:
    MyClass();
    ~MyClass();

    uint32_t getSize();

    T getData();
    void setData(T value);
};

template <class T>
MyClass<T>::MyClass()
{
    size = sizeof(T);
}
template <>
MyClass<std::string>::MyClass()
{ 
    size = 0;
}

template<class T>
class MyClass<std::vector<T>>
{
    MyClass();

    T data;
    size_t size;
};

template<class T>
MyClass<std::vector<T>>::MyClass()
{ 
    size = sizeof(T);
}

【讨论】:

  • 嗨 S.M.感谢您的提示。模板创建对我来说很新,我仍处于学习阶段。对我来说,您的回答中的新内容是,模板类可以定义两次,一次使用更具体的类型(例如std::vector&lt;T&gt;)。多亏了这一点,我才能实现我的目标。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多