作ることをC ++について非常に基本的なものがありますが、ここでのトピックに関する言説の多くは、理にかなっている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
関数を公開している限り、新しいアロケーターへの切り替えは簡単です。
これは名前空間では実現できません。
クラスの一部となる関数は常に必要ですか?いや
静的クラスを使用するのはアンチパターンですか?コンテキストに依存します。
ユーティリティ関数のコレクションが何らかの共有データを必要とする場合、たとえば、プライベート静的フィールドに保存できるキャッシュなど、状況は異なりますか?
その場合、あなたが達成しようとしていることは、オブジェクト指向プログラミングによって最もよく提供される可能性が高いです。