使用静态成员充当带有模板的命名空间:坏主意

Using static members to act as a namespace with templates : bad idea?

本文关键字:命名空间 静态成员      更新时间:2023-10-16

我有一个关于设计的问题。

我有一系列泛型函数,它们不属于同一个对象,但作用于相同的复杂类型。

我正在考虑将它们分组到模板化类中作为静态成员函数,原因有两个:

a) 我可以将 typedefs 放入我的"命名空间类"中,以便代码更具可读性b) 用户可以一劳永逸地对静态类进行 typedef,然后忘记专用函数。

所以而不是调用:

myfunction< char,int,std::set<double> >(...);

他可以做到:

typedef TheClass< char, int, std::set<double> > MyTheClass;

并写:

MyTheClass::myfunction(...);

你会认为这个糟糕的设计吗,为什么?

提前感谢!

我认为只要您可以应用 DRY 原则,这通常都是一个好主意,所以如果这可以让你避免重复传递相同的模板参数,并且你找不到更干净的替代方案,那就去做吧。

类中的模板函数只有在使用时才会被实例化。因此,即使您将所有函数包装在模板类中,它也不会效率低下,因为只有与特定类型参数集一起使用的函数才会为具有该类型参数集的模板实例化。

在可读性方面,我个人鄙视 typedef,除非在极少数情况下,因为你最终不得不追逐它们来弄清楚你的类型是什么,当你有很多用于采用不同类型参数的模板化类时,无论如何它都会变得令人沮丧和难以阅读。

也许将具有类似目的的函数包装在它们自己的真实命名空间中,当您想要使用它们时,您可以使用 using 子句引入它们,并为可选的 typedef 创建另一个命名空间,用户可以为这些函数单独引入:)