【发布时间】:2017-01-05 12:16:33
【问题描述】:
我有一个实现设计问题。我希望你能帮助我。假设我有以下课程
class A
{
public:
vector<int> v() const { return m_v; }
bool isValid() const { return m_v.size() > m_components; }
int operator [] (const int index) const { return m_v[index]; }
...
private:
vector<int> m_v;
int m_components;
}
现在我希望m_v 向量可以是不同的类型,所以我可以模板类:
template<typename T>
class A
{
public:
vector<T> v() const { return m_v; }
T operator [] (const int index) const { return m_v[index]; }
...
private:
vector<T> m_v;
int m_components;
}
但是,我意识到当 T 类型为 double 时,我需要扩展类 A 并添加更多属性,例如另一个 vector<bool> m_foo; 并更改应使用这些新属性的几个方法。
这是我有疑问的地方。我想我有几个选择:
选项1:我可以创建一个非模板基类A,实现所有常用方法,并为每种不同类型派生多个类(具有自己的特定类属性和方法实现),即:Aint, Adouble, Afloat。此选项要求 vector<...> m_v; 存储在每个派生类中,因此我必须多次复制所有相同的代码才能访问每个派生类中的 m_v; 属性。例子中只有v()、operator []和isValid()这样的方法,但在实际问题中还有更多。
选项 2: 模板专业化。我可以为每种类型专门化类模板,因此只提供根据T 类型更改的特定方法的实现。但是,这会强制在模板类中存储大量内容,这些内容仅在 T 为特定类型时使用,即仅在 T 类型为 double 时使用的 m_foo 向量(在建议的例子)。因此,我在浪费内存。此外,实现模板类并为几乎大多数模板类型提供模板类专业化并存储仅用于特定类型的特定属性似乎不是很优雅甚至连贯。
我不知道我是否能很好地解释我的问题。希望如此。
提前谢谢你。 哈维尔。
【问题讨论】:
-
那么,本质上,您希望
class A具有不同的功能,具体取决于模板类型参数? -
是和不是。我有一些独立于
T类型共享的方法,但也取决于这种类型,我有一些具有特定实现甚至需要特定类变量的方法。 -
您可以结合多种技术使其干燥。话虽这么说,这个问题太笼统了……这里没有什么可以作为我决定的依据。
-
"但是,我意识到当类型 T 为例如 double 时,我需要扩展类 A 并添加更多属性," 为什么?你想达到什么目标?对我来说,不清楚这里的用例是什么。看起来像一个XY问题!让我们谈谈不需要破坏的设计!
-
你能举个例子吗?
标签: c++ templates inheritance