IT박스

boost :: variant와 boost :: any는 어떻게 작동합니까?

itboxs 2020. 11. 18. 08:48
반응형

boost :: variant와 boost :: any는 어떻게 작동합니까?


Variant 및 Boost 라이브러리의 Any는 내부적으로 어떻게 작동합니까? 내가 작업중인 프로젝트에서 현재 태그 된 유니온을 사용하고 있습니다. C ++의 공용체는 생성자, 소멸자 또는 오버로드 된 할당 연산자와 함께 개체를 사용할 수 없기 때문에 다른 것을 사용하고 싶습니다.

나는 모든 변형의 크기를 쿼리하고 몇 가지 실험을 수행했습니다. 내 플랫폼에서 변형은 가능한 가장 긴 유형에 8 바이트를 더한 크기를 취합니다. 8 바이트 o 유형 정보이고 나머지는 저장된 값이라고 생각합니다. 반면에 어떤 것은 8 바이트 만 사용합니다. 저는 64 비트 플랫폼을 사용하고 있기 때문에 포인터 만 가지고있는 것 같습니다.

Any는 어떤 유형을 보유하고 있는지 어떻게 압니까? Variant는 템플릿을 통해 어떤 작업을 수행합니까? 사용하기 전에이 클래스에 대해 더 알고 싶습니다.


boost :: any 문서를 읽으면 아이디어에 대한 소스를 제공합니다. http://www.two-sdg.demon.co.uk/curbralan/papers/ValuedConversions.pdf

기본 정보 숨김, 필수 C ++ 기술입니다. 그것을 배우십시오!

여기에서 가장 많이 득표 한 답변은 완전히 틀렸고 사람들이 실제로 그 사실을 확인하기 위해 소스를 살펴볼 것이라는 의심이 있습니다. 여기에 모든 유형을 f () 함수로 래핑하는 유사한 인터페이스의 기본 구현이 있습니다. 호출 할 수 있습니다.

struct f_any
{
   f_any() : ptr() {}
   ~f_any() { delete ptr; }
   bool valid() const { return ptr != 0; }
   void f() { assert(ptr); ptr->f(); }

   struct placeholder
   {
     virtual ~placeholder() {}
     virtual void f() const = 0;
   };

   template < typename T >
   struct impl : placeholder
   {
     impl(T const& t) : val(t) {}
     void f() const { val.f(); }
     T val;
    };
   // ptr can now point to the entire family of 
   // struct types generated from impl<T>
   placeholder * ptr;

   template < typename T >
   f_any(T const& t) : ptr(new impl<T>(t)) {}

  // assignment, etc...
};

boost :: any는 f ()가 실제로 반환 typeinfo const&하고 작동 할 any_cast 함수에 대한 다른 정보 액세스를 제공 한다는 점을 제외하면 동일한 기본 작업을 수행합니다.


간의 주요 차이 boost::anyboost::variant그 인 any반면, 임의의 타입을 저장할 수 variant열거 타입들의 세트 중 하나만을 저장할 수있다. any형 매장은 void*객체에 대한 포인터뿐만 아니라 typeinfo객체는 기본 유형을 기억하고 형태의 안전성을 어느 정도 시행합니다. 에서는 boost::variant최대 크기의 개체를 계산하고 "새로 배치"를 사용하여이 버퍼 내에 개체를 할당합니다. 또한 유형 또는 유형 색인을 저장합니다.

Boost가 설치되어 있으면 "any.hpp"및 "variant.hpp"에서 소스 파일을 볼 수 있습니다. 설치된 헤더를 찾을 때까지 "/ usr", "/ usr / local"및 "/ opt / local"에서 "include / boost / variant.hpp"및 "include / boost / any.hpp"를 검색하고 당신은 볼 수 있습니다.

편집
아래 주석에서 지적했듯이 boost :: any에 대한 설명에 약간의 부정확성이 있습니다. 그것은 사용하여 구현 될 수 있지만 void*(그리고 제대로 포인터를 삭제에 콜백을 파괴 템플릿)에 actualy 구현 용도 any<T>::placeholder*any<T>::holder<T>의 서브 클래스로 any<T>::placeholder유형을 통합합니다.


boost::any just snapshots the typeinfo while the templated constructor runs: it has a pointer to a non-templated base class that provides access to the typeinfo, and the constructor derived a type-specific class satisfying that interface. The same technique can actually be used to capture other common capabilities of a set of types (e.g. streaming, common operators, specific functions), though boost doesn't offer control of this.

boost::variant is conceptually similar to what you've done before, but by not literally using a union and instead taking a manual approach to placement construction/destruction of objects in its buffer (while handling alignment issues explicitly) it works around the restrictions that C++ has re complex types in actual unions.

참고URL : https://stackoverflow.com/questions/4988939/how-do-boostvariant-and-boostany-work

반응형