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::any
및 boost::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 union
s.
참고URL : https://stackoverflow.com/questions/4988939/how-do-boostvariant-and-boostany-work
'IT박스' 카테고리의 다른 글
HTML 이미지 맵과 함께 JQuery 호버 사용 (0) | 2020.11.18 |
---|---|
실행중인 Oracle 클라이언트 버전을 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.18 |
std :: function 작동 방식 (0) | 2020.11.18 |
D3.js에서 속성을 제거하는 방법은 무엇입니까? (0) | 2020.11.18 |
잡히지 않은 ReferenceError : 함수가 onclick으로 정의되지 않았습니다. (0) | 2020.11.18 |