2013-05-22 2 views
2

boost::any을 범용 형식으로 사용하여 컨테이너에 저장하고 다른 기능으로 전달할 수 있습니다. 하지만이 함수 안에서는 항상 실제 유형을 알고 있으므로 런타임에 어떤 유형 안전 검사와 부과 된 오버 헤드가 필요하지 않습니다. static_cast이면 충분합니다.boost_any를 사용하는 동안 오버 헤드를 피할 수 있습니까?

이상적인 솔루션은 boost::polymorphic_downcast과 같은 것을 사용하는 것이지만이 경우에는 적용 할 수 없다는 것을 알 수 있습니다.

void*에 대한 자체 래퍼를 작성해야합니까, 아니면 다른 옵션이 있습니까?

+2

어쨌든 컴파일 타임에 유형을 알고 있다면 왜 'boost :: any'가 필요한가요? 컨테이너에 넣어야하는 모든 유형을 포함하는 구조체를 사용할 수 없습니까? –

+0

@TonyTheLion : 메모리가 비효율적일까요? –

+1

'any'가 올바른 타입이고 실제로 타입을 알고 있다면 void 포인터의 컨테이너를 만들 수 있습니다. –

답변

1

당신은 shared_ptr<void>을 사용하거나 boost::any을 대체 할 static_cast과 unique_ptr 수 shared_ptr<void> 같은 원시 void* 포인터에 비해 몇 가지 장점이있다 : 자동 저장을 삭제

  • 수있는 코드에서 여러 객체에 의해 참조되는 (될 수있다 이 필요 없음)

물론이 경우 모든 포인터에 대해 더 많은 메모리가 필요합니다 (참조 카운트 용 ng 및 deleter).

공유가 너에게 좋지 않고 개체가 컨테이너에만있는 경우 unique_ptr<void>을 사용할 수도 있습니다.