使用静态成员充当带有模板的命名空间:坏主意
Using static members to act as a namespace with templates : bad idea?
我有一个关于设计的问题。
我有一系列泛型函数,它们不属于同一个对象,但作用于相同的复杂类型。
我正在考虑将它们分组到模板化类中作为静态成员函数,原因有两个:
a) 我可以将 typedefs 放入我的"命名空间类"中,以便代码更具可读性b) 用户可以一劳永逸地对静态类进行 typedef,然后忘记专用函数。
所以而不是调用:
myfunction< char,int,std::set<double> >(...);
他可以做到:
typedef TheClass< char, int, std::set<double> > MyTheClass;
并写:
MyTheClass::myfunction(...);
你会认为这个糟糕的设计吗,为什么?
提前感谢!
我认为只要您可以应用 DRY 原则,这通常都是一个好主意,所以如果这可以让你避免重复传递相同的模板参数,并且你找不到更干净的替代方案,那就去做吧。
类中的模板函数只有在使用时才会被实例化。因此,即使您将所有函数包装在模板类中,它也不会效率低下,因为只有与特定类型参数集一起使用的函数才会为具有该类型参数集的模板实例化。
在可读性方面,我个人鄙视 typedef,除非在极少数情况下,因为你最终不得不追逐它们来弄清楚你的类型是什么,当你有很多用于采用不同类型参数的模板化类时,无论如何它都会变得令人沮丧和难以阅读。
也许将具有类似目的的函数包装在它们自己的真实命名空间中,当您想要使用它们时,您可以使用 using 子句引入它们,并为可选的 typedef 创建另一个命名空间,用户可以为这些函数单独引入:)
相关文章:
- Typedef 不是命名空间的成员
- 将typeID转换为静态成员访问(C )的命名空间
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- "uintmax_t":不是"全局命名空间"的成员
- 从另一个命名空间访问标准命名空间数据成员
- 我们不能在未赋值的上下文中命名非静态成员函数是有原因的吗
- C++命名空间错误:不是命名空间的成员
- InitializeCriticalSectionEx 不是 atlwinverapi.h 中全局命名空间的成员
- 在vs2010中使用iostream时,出现错误C2039:'exit':不是"全局命名空间"的成员
- 函数不是全局命名空间的成员
- 不是全局命名空间的成员
- 一个命名空间是否可以是另一个命名空间的成员
- "CreateEvent":不是 ASIO 中"全局命名空间"的成员
- 当外部命名空间具有具有相同名称的成员时,访问未命名命名空间的成员
- Template函数不是命名空间的成员
- c++中的命名空间私有成员
- 命名空间“静态”是否仍在 C++11 中弃用
- 编译错误错误 C2039:"clock_t":不是"全局命名空间"的成员
- 如何在用户定义的命名空间的成员函数中引用指针 **environ?
- C2039:类不是命名空间的成员