假设我有一个类可以使用不同类型的距离函数(欧几里德距离等)来进行一些比较.我已将这些函数实现为类Distance的子类:
class Distance;
class EuclideanDistance : public Distance;
class OtherDistance : public Distance;
Run Code Online (Sandbox Code Playgroud)
似乎要选择使用哪种类型的距离,我可以这样做:
template <typename TDistance>
class MyClass;
Run Code Online (Sandbox Code Playgroud)
并实例化它:
MyClass<EuclideanDistance> instance;
Run Code Online (Sandbox Code Playgroud)
或完成相同的事情:
class MyClass
{
public:
Distance* myDistanceFunction;
}
Run Code Online (Sandbox Code Playgroud)
并用它实例化它
MyClass instance;
instance.myDistanceFunction = new EuclideanDistance;
Run Code Online (Sandbox Code Playgroud)
一种方法比另一种方法有什么优势吗?
谢谢,
大卫
关联(即没有模板的解决方案)是首选,因为它为您提供了更大的灵活性,允许您在运行时更改距离实现,生成更清晰的错误消息和更清晰的目标文件(更少的符号).
此外,从使用不同类型(距离实现)参数化的模板生成的类将被视为不同类型,并且不可互换:MyClass<EuclideanDistance>是不同的类型MyClass<MinkowskiDistance>.这将迫使您制作在MyClass模板上运行的所有功能,并最终导致更大的复杂性,而无需额外的好处.
当你需要放松语言的类型安全性时,应该使用模板,例如当你编写一个应该在许多不相关类型(不是从公共基类/接口派生)上运行的类时,它仍然表现在类似的方式(例如,所有都有kwak()成员函数).这称为duck-typing:类型与形式无关,但都具有相似的属性.
如果您无法确保所有距离实现都来自公共基类/接口,则可能需要使用模板.否则,更喜欢简单灵活的关联.