尽管有关C ++的某些基本知识可以使es / s namespaces
与class
es / struct
s截然不同,但此处有关该主题的大部分论述还是有意义的。
静态类(所有成员都是静态的类,并且永远不会实例化的类)本身就是对象。它们不只是namespace
包含功能的一个。
模板元编程允许我们使用静态类作为编译时对象。
考虑一下:
template<typename allocator_type> class allocator
{
public:
inline static void* allocate(size_t size)
{
return allocator_type::template allocate(size);
}
inline static void release(void* p)
{
allocator_type::template release(p);
}
};
要使用它,我们需要包含在类中的函数。名称空间在这里不起作用。考虑:
class mallocator
{
inline static void* allocate(size_t size)
{
return std::malloc(size);
}
inline static void release(void* p)
{
return std::free(p);
}
};
现在使用它:
using my_allocator = allocator<mallocator>;
void* p = my_allocator::allocate(1024);
...
my_allocator::release(p);
只要新的分配器公开兼容的allocate
and release
函数,切换到新的分配器就很容易。
这是无法通过名称空间实现的。
您是否总是需要函数才能成为课程的一部分?没有。
使用静态类是反模式吗?这取决于上下文。
如果实用程序功能的集合需要一些共享数据,例如可以将其存储在私有静态字段中的缓存,情况会有所不同吗?
在这种情况下,您试图实现的目标可能最好通过面向对象的编程来实现。