2009-04-23 2 views

답변

6

나는 Boost.Variant가 항상 방해받지 않고 매우 구조화 된 프로그래밍을 요구하기 때문에 언제나 선호되어야한다고 생각한다.

하지만 boost.any의 주요 아이디어는 java 및 C# 개체 유형과 동일한 기능을 제공하는 것입니다. 그것은 "우리가 할 수있다"고 말하는 방식입니다! :-)

+4

보유 할 유형이 런타임에 알려지기 때문에 Boost.Variant는 Boost.Any를 대체 할 수 없습니다. 예를 들어, SCFrench의 논평에서 언급 된 링크를 참조하십시오 : http://www.ddj.com/cpp/184403808 –

+0

-1. Boost.any는 C#/java "객체"가 아닌 모든 유형, 심지어 원시 유형까지 저장할 수 있습니다. – Macke

+0

@Macke이 경우 C#/java를 말하지 마십시오. C# (CLR)은 객체에 프리미티브 값을 저장할 수 있습니다. 언어는 비슷해 보이지만 다를 수 있습니다. – erikkallen

21

boost :: any는 분명히 기본 클래스가없는 유형을 int 및 float로 저장합니다. 당신이 그것을 사용할 수있는 현실적인 예제는 높은 수준의 해석 언어를위한 가상 기계입니다. "함수"객체에는 인수 배열이 필요합니다. 이것은 뒤에서 std::list<boost::any>으로 쉽게 구현할 수 있습니다.

3

개체의 계층 구조 루트에 일부 일반 형식을 사용하고 해당 기본 형식으로 컨테이너를 만들면 동일한 기능을 구현할 수없는 이유는 무엇입니까?

주변 장치 문제를 해결하기 위해 디자인에 인위적으로 주입하는 구성 요소 인 개체 계층을 호출합니다. 또한, 그러한 구조는 잘못되기 쉽고 잘못된 구현은 혼란을 야기 할 수 있습니다. Boost.Any 인 커뮤니티가 안전하고 검증 된 대안을 검토했습니다.

실생활의 예제를 제공해 주시겠습니까?

TinyJSONboost.Any을 사용합니다.

boost.any 라이브러리를 사용하면 어떤 이점이 있습니까?

설명서는 introductory입니다.

+4

JSON을 C++로 표현하려면'boost :: variant '이 제 생각에는 더 나은 선택입니다. –

+1

나는 그 라이브러리를 쓰지 않았다 :-) 나는 당신이 유효한 이유가 있다고 확신한다. – dirkgently

2

우리는 boost.any를 타입 안전 태그가있는 가변 컨테이너의 캐리어 유형으로 사용합니다. 그 의미는 다음과 같습니다.

우리는 "뗏목"개체를 가지고 있으며,이 개체는 일련의 필터를 통과합니다. 필터가 뗏목에 데이터를 추가하고자 할 때,이 같은 일을 할 수 있습니다

raft.addTaggedData<ETag1>(3.0); 
raft.addTaggedData<ETag2>("a string")`; 
std::string str = raft.getTaggedData<ETag2>(); 
int a = raft.getTaggedData<ETag1>(); // <-- Compile error 

경우 ETag1ETag2는 열거의 멤버, 우리는 유형에 태그를 매핑 할 특성 템플릿을 사용하십시오.

뗏목 종류는 listpair<ETagType, boost::any>이고 보조 저장소로 사용됩니다. Boost.any는 다양한 유형의 원시 버퍼 관리의 어려움을 덜어 줬습니다.

+0

약간의 boost.MPL을 사용하면 Boost.Any 대신 boost.Variant를 사용할 수 있습니다. –

+0

심지어 boost.any를 사용하는 것조차 약간의 스트레칭이었습니다. 우리 팀은 C++ 기능에 관해서는 다소 보수적입니다. 게다가, 나는 MPL을 아직 배웠다. :) –

+0

@ Benoît Boost.Variant는 가능한 모든 태그 (또는 적어도 값 유형)를 알기 위해 뗏목을 요구합니다. 예를 들어 뗏목이 이러한 방식으로 일종의 개인 정보를 저장할 수있는 독립 모듈을 통해 떠 다니는 경우 이는 불가능합니다. 또는 가능한 경우에도 이러한 방식으로 소스 종속성이 증가했기 때문에 바람직하지 않을 수 있습니다. Boost.Any는 런타임 비용을 증가 시키므로 절충됩니다. –

3

우리는 속성 맵 (std::map<std::string, boost::any>)에서이를 사용하여 단순하고 평평한 데이터 공간에 많은 것을 동적으로 저장합니다.

대개 우리는 smart-ptr-scriptable-objects 또는 문자열을 저장하지만 다른 유형 (float, vec3f, 행렬 및 기타 비표준 객체)이있는 일부 항목을 저장합니다.

C++에 더 많은 동적 기능을 추가하거나 모든 유형의 데이터를 개체에 추가하기 위해 일부 형식 지우기를 원하는 경우 어디에서나 잘 작동합니다.

5

Boost 's에 대해 처음 알았을 때 Herbs Sutter와 Jim Hyslop이 Dr. Dobbs에서 this article을 발견했습니다. 나는 그것이 도움이되는 것을 알았다.

관련 문제