如何解决基于C ++模板的设计-构建基于模板的项目时最好的模板准则是什么? 根据有效的投放类型
假定模板C ++代码的以下结构:
class SpokenLang
{
private: std::string lang;
...
};
class Greek : public SpokenLang
{
...
};
class English : public SpokenLang
{
...
};
// HDT (stands for Height Data Type and is the data type used to specify the selected HT)
template <typename HDT> // For example we could use either float or double for the Height Data Type
class AbsoluteHeight
{
private: HDT height;
...
};
// HDT (stands for Height Data Type and is the data type used to specify the selected HT)
template <typename HDT> // For example we could use either float or double for the Height Data Type
class RelativeHeight
{
private: HDT height;
...
};
// SL (stands for SpokenLanguage derived classes
// HT (stands for Height Type - either AbsoluteHeight or RelativeHeight)
// HDT (stands for Height Data Type and is the data type used to specify the selected HT)
template <typename SL,typename HT,typename HDT>
class Student
{
private: SL spokenLanguage;
HT<HDT> height;
...
}
现在假设您有一组学生。最好的模板设计是什么,以便于进行简单明了的设计而不必指定每个学生对象使用的确切类型?
例如: 我是否应该在运行时使用指针并对其进行静态转换,以便猜测每个学生使用的适当类型?
Student** students = new Student*[10];
students[0] = new Student<Greek,AbsoluteHeight,float>();
students[1] = new Student<English,RelativeHeight,float>();
...
或使用以下更紧凑的设计(就模板参数的使用数量而言更紧凑?:
// ...(declarations omitted for brevity)...
// SL (stands for SpokenLanguage derived classes
// HT (stands for Height Type - for example AbsoluteHeight<float> or RelativeHeight<double>)
template <typename SL,typename HT>
class Student
{
private: SL spokenLanguage;
HT height;
...
};
...
Student** students = new Student*[10];
students[0] = new Student<Greek,AbsoluteHeight<float>>();
students[1] = new Student<English,RelativeHeight<double>>();
...
当我需要操纵学生对象时,如何安全地投射有关嵌套模板参数的“缺失”信息? 我的问题是:
- “构建基于模板的项目时最好的模板准则是什么?”
- 是否有一些指导方针,以防止我的模板化类因许多模板参数而“膨胀”?
- 是否有关于此类模板准则(技巧/最佳实践)的书籍?您能给他们任何一个(或最好的一个)命名吗?
注意: 我不想使用任何糖STL解决方案,例如is_base等。我想要PURE C ++解决方案。好像根本没有STL库。 (我来自C和Java的专业背景。)
解决方法
在开始模板化之前,您应该考虑一个清晰的界面!
拥有一个具有几乎完全不同的数据类型且内部没有通用接口的类层次结构是什么意思?
在您必须手动投射某些东西的时候,您可以清楚地表明您的设计已损坏。信息必须在类内部,而不是在访问对象之前需要强制转换的代码中。我相信,如果您清理了界面,就不需要任何强制转换!
在上面的示例中,似乎是定义接口的起点,该接口使您的数据可被代码的其他部分访问,例如:
template <typename SL,typename HT,typename HDT>
class Student: public StudentInterface {...};
现在您必须定义访问数据(例如打印,编辑等)所需的界面类型。
如果您现在喜欢编译时多态或运行时多态,则由您决定。当您定义具有许多可能的模板变体的非常复杂的数据集时,我希望运行时多态性更容易实现,并且足以满足您的使用情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。