그 만드는 ++ 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
및 release
기능을 노출하는 한, 새로운 할당기로 쉽게 전환 할 수 있습니다.
네임 스페이스로는이 작업을 수행 할 수 없습니다.
클래스의 일부가 되려면 항상 함수가 필요합니까? 아니.
정적 클래스를 사용하는 것이 안티 패턴입니까? 상황에 따라 다릅니다.
유틸리티 함수 모음에 개인 정적 필드에 저장할 수있는 캐시와 같은 일부 공유 데이터가 필요한 경우 상황이 다릅니 까?
이 경우 달성하려는 것은 객체 지향 프로그래밍을 통해 가장 잘 제공 될 수 있습니다.