2012-09-15 2 views
1

많은 다른 유형의 경우 std::shared_ptr<T>을 사용하고 있습니다. 이 모든 다른 벡터를 하나의 벡터에 저장하기 때문에 나는 std::vector<std::shared_ptr<void> >을 가지고 있다고 생각하고 필요하다면 void으로 캐스팅했다.std :: shared_ptr에서 "cast from/to void"와 유추

나는 다음과 같은 "베어 포인터"사용이 g++와 함께 완벽하게 작동하고 당신이 벌거 벗은 포인터가있는 경우이 작업을 수행 할 수있는 적절한 방법 AFAIK

#include <iostream> 

void print(void* void_ptr) 
{ 
    int* int_ptr = static_cast<int*>(void_ptr); 
    std::cerr << *int_ptr << std::endl; 
} 

int main() 
{ 
    int* int_ptr = new int(4); 
    void* void_ptr = static_cast<void*>(int_ptr); 
    print(void_ptr); 
    delete int_ptr; 
} 

을 잘 알고 있어요. 하지만 지금은 std::shared_ptr와 동일하게하고 싶습니다.

#include <iostream> 
#include <memory> 

void print(std::shared_ptr<void> void_ptr) 
{ 
    std::shared_ptr<int> int_ptr = ??(void_ptr); // simple cast won't work 
    std::cerr << *int_ptr << std::endl; 
} 

int main() 
{ 
    std::shared_ptr<int> int_ptr = std::make_shared<int>(4); 
    std::shared_ptr<void> void_ptr = ??(int_ptr); // same problem here 
    print(void_ptr); 
} 

이 경우에도 가능합니까? 내가 가진 shared_ptr을 가지고있는 많은 다른 타입들이 있지만,이 타입들은 공통점이 거의 없습니다. 그들은 기본 클래스 또는 이와 유사한 것을 공유하지 않습니다. (유일한 방법 인 경우이를 수행 할 것이지만 shared_ptr<void>과 같이 좀 더 굉장합니다).

+1

다음 질문/답변을 읽는 것이 좋습니다. http://stackoverflow.com/questions/5913396/why-do-stdshared-ptrvoid-work. 저는 특정 질문에 대한 다소 안목이있는 사람이기 때문에 공유 할 지식이 없지만 그 링크에 대한 정보는 귀하에게 실행 가능한 솔루션에 도달하는 데 도움이 될 것입니다. – paercebal

+0

그들은 공통점이 없다면 왜 왜 그들에게'void *'를 전달하려고합니까? 일반적으로'void *'를 사용한다면 뭔가 잘못되었거나 함수의 시그니쳐에서 타입을 얻으 려합니다 (즉, 이론적으로는 어떤 타입이라도 취할 수있는 함수이므로 특정 유형을 취하는 함수로 전달). 후자의 경우, 당신은'boost :: any'를 사용해야합니다. 이것은 type-safe합니다. –

+0

@ NicolBolas : 기본적으로 "수학"과 "코드"를 분리하고 싶습니다. 수학적 구조를 나타내는 클래스가 있습니다. 이러한 각 클래스 중 하나의 클래스에는 'Foo'라는 객체가 있어야합니다. 이제는'foo' 객체가 모든 것을 모른 채 수학 객체에 액세스하게하는 레이어를 만들고 싶습니다. 나는 올바른 사용을 돌보고 나는 "나는 정말로 그것이 무엇인지 전혀 알지 못하고 지나가고 싶은 무언가에 대한 포인터를 가지고있다."라고 무효로 생각한다. 나는 '부스트'를 사용하고 싶지 않다. – stefan

답변

1

std::static_pointer_cast이이 기능을 수행합니다. 그러나 이것은 일반적으로 매우 나쁜 생각입니다 - 왜 boost::any 또는 boost::variant 또는 뭔가? 약하게 입력되고 약하게 시행되는 코드는 엉덩이를 때리는 것입니다.

0

문제의 최선의 해결책은 type erasure 일 수 있습니다.

C++로 보는 것은 (인수가 변환 가능한 경우에도) 템플릿 간의 암시 적 변환을 허용하지 않습니다.

컨테이너에서 보관할 공통 인터페이스 (처음에는 operator*operator->)를 정의하고, 삭제 유형을 위해 shared_ptr에 씬 템플릿 클래스를 사용하는 것보다 더 할 수 있습니다.

편집 : 질문 @paercebal에 명시된 바와 같이

템플릿 매개 변수가 void 때, shared_ptr가 자신의 형의 삭제를 수행 할 수 있습니다 지적했다. 그래서 당신은 그것도 조사해야합니다.

+0

나는 "타입 소거"를 얻는 것을 보이지 않는다. 내가 아는 한 귀하의 링크 된 기사를 이해하는 한 그것은 공통된 기본 클래스 인 것 같습니다. 그게 맞습니까? – stefan

+0

요컨대, 그렇습니다. 기본 클래스를 사용하여 인터페이스를 정의하고이를 구현하는 템플릿을 만드는 것입니다. 그런 식으로 보류 할 수있는 유형의 공통 기본 클래스를 적용하지 않고 공통 인터페이스의 이점을 얻을 수 있습니다. – StoryTeller