gpt4 book ai didi

c++ - 通过模板参数选择子类和实例化成员变量的区别

转载 作者:可可西里 更新时间:2023-11-01 17:35:45 24 4
gpt4 key购买 nike

假设我有一个类可以使用不同类型的距离函数(欧氏距离等)来进行一些比较。我已经将这些函数实现为 Distance 类的子类:

class Distance;
class EuclideanDistance : public Distance;
class OtherDistance : public Distance;

似乎要选择使用哪种类型的距离,我可以这样做:

template <typename TDistance>
class MyClass;

并实例化它:

MyClass<EuclideanDistance> instance;

或者完成同样的事情:

class MyClass
{
public:
Distance* myDistanceFunction;
}

并用

实例化它
MyClass instance;
instance.myDistanceFunction = new EuclideanDistance;

一种方法比另一种方法有什么优势吗?

谢谢,

大卫

最佳答案

关联(即没有模板的解决方案)是更可取的,因为它为您提供了更大的灵 active ,允许您在运行时更改距离实现,生成更清晰的错误消息和更清晰的目标文件(更少的符号)。

此外,从使用不同类型(距离实现)参数化的模板生成的类将被视为不同类型并且不可互换:MyClass<EuclideanDistance>是不同于 MyClass<MinkowskiDistance> 的类型.这将迫使您创建所有在 MyClass 上运行的函数。模板也是如此,最终将导致更大的复杂性,而不会带来额外的好处。

当您需要放宽语言的类型安全性时,应该使用模板,例如,当您正在编写一个应该对许多不相关类型(不是从公共(public)基类派生)进行操作的类时类/接口(interface)),但它们的行为方式相似(例如,它们都有一个 kwak() 成员函数)。这叫做 duck-typing : 类型在形式上是不相关的,但都表现出相似的属性。

如果您无法确保所有距离实现都派生自公共(public)基类/接口(interface),您可能需要使用模板。否则,更喜欢简单灵活的关联。

关于c++ - 通过模板参数选择子类和实例化成员变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8041697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com