2012-06-28 4 views
7

:: 부스트의 내용에 포인터 * 부스트에 포함 된 객체를 가리 키도록 :: 어떤 목적.확보 무효 * 내가 무효 * 나는이 무효을 원하는</p> <p>을 받아들이는 방법이있는 외부 라이브러리를 사용하고있는

boost :: any 개체의 콘텐츠 주소를 가져올 수 있습니까?

나는 지금까지 myAny.content로 경기를하려하지만 운이 없다! 나는 dynamic_cast 또는 unsafe_any_cast의 조합을 통해 필요한 정보를 얻을 수 있기를 바랍니다.

감사합니다.

답변

3

이것은 불가능합니다. boost::any_cast은 유형이 포함 된 유형과 다른 경우 캐스트를 거부합니다.

boost::any any_value(value); 
void *content = boost::unsafe_any_cast<void *>(&any_value); 

는 헤더가 있습니다 : 지원되지 않는 내부 해킹을 사용하고자하는 경우

current version of the header은 (그 이름에서 알 수 있듯이이) boost::any_cast에 의해 수행 유형 검사를 무시 문서화되지 않은 및 지원되지 않는 기능 boost::unsafe_any_cast있다 이것에 대해 말하기 unsafe_any_cast :

// Note: The "unsafe" versions of any_cast are not part of the 
// public interface and may be removed at any time. They are 
// required where we know what type is stored in the any and can't 
// use typeid() comparison, e.g., when our types may travel across 
// different shared libraries. 
+0

이것은 문서화 된 인터페이스의 일부 여야하므로'boost :: any'는'void * '를 사용하는 레거시 코드와 함께 사용될 수 있습니다. 가장 슬픈 것은'std :: experimental :: any'는'unsafe_any_cast'를 가지고 있지 않은 것처럼 보입니다. – alfC

5

boost::any_cast을 사용하면 기본 유형에 대한 포인터를 얻을 수 있습니다 (컴파일 타임에 알고있는 경우).

boost::any any_i(5); 

int* pi = boost::any_cast<int>(&any_i); 
*pi = 6; 

void* vpi = pi; 
+0

이 코드는 실제로 무엇을 수행합니까? 주소 자체를 int로 변환하는 것 같습니다. 어떻게 된거 야? – ftvs

+1

그건 boost :: any_cast가하는 것입니다. 그것은'dynamic_cast'와 비슷한 의미를 가지고 있습니다. 이 경우, 저장된 int 타입이 int이기 때문에'int *'에 캐스트 할 수있다. 다른 포인터 타입 ('float *')에 케이싱하면'nullptr'이 리턴 될 것입니다. 레퍼런스 타입으로 캐스팅하는 것은 성공하거나,'boost :: bad_any_cast' 예외를 throw합니다. 'boost :: any'는 정확한 타입 매치에서만 작동합니다. 올바르게 호출하면 매칭에'typeid'를 사용합니다. – Chad