2012-01-14 2 views
5

개체에 대한 참조를 boost::any 개체에 저장하려고합니다. boost :: any 객체를 어떻게 초기화합니까? std::ref()을 시도했지만 boost::anystd::reference_wrapper<>으로 초기화됩니다. 예를 들어, 나는 boost::any 대신 int&를 포함 할어떻게 개체에 대한 참조와 함께 boost :: any를 초기화합니까?

#include <boost/any.hpp> 
#include <cxxabi.h> 
#include <iostream> 

int main(void) 
{ 
    int s; 
    int i = 0; 
    boost::any x(std::ref(i)); 
    std::cout << abi::__cxa_demangle(x.type().name(), 0, 0, &s) << "\n"; 
    return 0; 
} 

인쇄

std::reference_wrapper<int> 

다음.

+0

참조 유형에 대한 type_info가없는 대신 참조되는 유형에 대한 type_info는'cout << typeid (int) .name() << >> \ t "<< typeid (int &)입니다. << "\ t"<< typeid (int) == typeid (int &)'는'ii 1'을 생성하므로 any가 참조를 저장하더라도 그 타입은 여전히'typeid (int)'가됩니다. – stellarpower

답변

3

클래스에는 다음과 같은 것을 허용하는 인터페이스가 없습니다. 생성자와 함께 참조 유형을 지정해야합니다. 템플릿으로 된 생성자의 유형을 명시 적으로 지정할 수는 없다고 생각합니다. 왜냐하면 내가 찌를 수있는 장소가 없기 때문입니다. 템플릿 매개 변수를 명시 적으로 지정할 수 있다고해도 C++ 2003에서는 사용할 수없는 참조 축소가없고 매개 변수가 T const&으로 선언되어 있기 때문에 T& const&을 만들려고합니다. 파리. 원격으로 참조 할만한 것을 고집하거나 그냥 T*을 사용하고 싶다면 가장 좋은 옵션은 std::reference_wrapper<T>입니다.

그렇다면 템플릿 인수를 명시 적으로 지정하는 데 사용되는 boost::any과 유사한 유형의 템플릿 화 된 정적 요소 방법을 일반적으로 사용할 수 있습니다. 그러나 boost::any값 유형을 처리하기 위해 의도적으로 설계되었으므로이 작업은 수행되지 않습니다. 나는 포인터가 포인터를 사용하는 것이 좋은 대안이라고 생각한다. 참조 유형이 정말로 필요한 경우 직접 구현해야합니다.

3

동작이 올 바르고 적절하고 적절합니다. std::refstd::reference_wrapper<T> 유형의 객체를 만드는 도우미 함수이며 참조 래퍼는 참조를 보유하는 값 의미가있는 클래스입니다. 이는 컨테이너를 바깥쪽으로 추적하려는 경우 정확히 컨테이너에 넣고 싶은 일종의 것입니다. 참조.

그래서 해결책을 찾으십시오.

당신이 원한다면 참조 배열을 가질 수없는 것처럼 직접적인 알몸 참조의 컨테이너를 가질 수 없습니다. 래퍼는 이러한 요구를 수용 할 수 있도록 정확하게 설계되었습니다.