boost variant 예제

boost variant 예제

std::variant은 공용 구조체와 유사한 방식으로 메모리를 사용하므로 기본 형식의 최대 크기를 사용합니다. 그러나 현재 활성 대안이 무엇인지 알 수있는 무언가가 필요하기 때문에 더 많은 공간을 추가해야합니다. 보시다시피, S 노조는 당신의 측면에서 유지 보수를 많이 필요로한다. 새 변형으로 전환하기 전에 어떤 형식이 활성 상태이고 소멸자/생성자호출이 적절히 호출되는지 알아야 합니다. 기본적으로 변형 기본값은 첫 번째 바인딩된 형식을 생성하므로 v는 처음에 int(0)를 포함합니다. 원하지 않거나 첫 번째 bounded 형식이 기본 구성가능하지 않은 경우 변형을 바인딩된 형식 중 하나로 변환할 수 있는 값에서 직접 생성할 수 있습니다. 마찬가지로, 변형은 다음에서 설명한 대로 바인딩된 형식 중 하나에 변환 가능한 값을 할당할 수 있습니다(참고: std:forward는 “전달 참조”인 변형 및 방문자를 완벽하게 전달하기 위해 사용해야 합니다). 기사를 통해 우리는 또한 재귀 변형 방문을 다루지 않았다 : 그것은 내 다음 기사의 주제가 될 것입니다. 재귀 변이체에 대해 “람다 기반” 및 “불-앤-잊어버리기” 방문 함수를 빌드할 수 있으므로 추가 오버헤드를 피할 수 있습니다(예: std::function은 사용되지 않음).

그러나 이러한 코드는 매우 취약하며 주의없이 런타임에만 감지 할 수있는 미묘한 논리 오류가 발생할 수 있습니다. 예를 들어, 추가 경계 형식이 있는 변형에서 작동하도록 times_2를 연장하려는 경우를 고려합니다. 특히 std::complex 세트에 추가해 보겠습니다. 분명히 함수 선언을 적어도 변경해야 합니다: 첫 번째 경우 – 할당 연산자로 – 예외는 형식의 생성자에서 throw됩니다. 이 문제는 변형에서 이전 값을 대체하기 전에 발생하므로 변형 상태가 변경되지 않습니다. 당신이 볼 수 있듯이 우리는 여전히 int에 액세스하고 인쇄 할 수 있습니다. “Hello World”에는 const char*의 유형이 있으며 C ++ 컴파일러는 이를 std::string이 아닌 bool로 변환합니다! 참조 c ++ – 부스트 ::변형 – 왜 “const char*”가 “bool”로 변환되는가? – 스택 오버플로우. 위의 자습서에서 볼 수 있듯이 방문은 변형 콘텐츠를 조작하기 위한 강력한 메커니즘입니다. 이진 방문은 두 개의 서로 다른 변형 객체의 내용을 동시에 방문 할 수 있게하여 방문의 힘과 유연성을 더욱 확장합니다. 부스트 변형은 2004 년 주위에 도입되었다, 그래서 std 전에 경험 13 년이었다 ::변형은 표준에 추가되었습니다.

STL 유형은 부스트 버전의 경험에서 가져와서 향상시킵니다. 다중 방문은 세 가지 이상의 변형 객체의 내용을 동시에 방문 할 수 있게하여 방문의 힘과 유연성을 확장합니다. 다중 방문자를 위한 헤더는 별도로 포함되어야 합니다. 변형을 사용 하 여 내 위의 문제를 무시, Mach7 패턴 일치 기반 행동은 매우 깔끔 하 고 표준 방문자 구현 보다 더 나은, 하지만 주요 혜택 은 구문/가독성 처럼 보인다 – 확실히 가치 있는 개선, 하지만 난 하지 않습니다. 정말 크게 패턴을 변경으로 볼 수 있습니다. 나는 내가 여기에 근본적인 무언가를 놓치고 있다는 것을 받아 들일 수 있어 기쁩니다! Boost.Variant은 연합체와 유사한 부스트::변형이라는 클래스를 제공합니다. 다른 유형의 값을 boost::variant 변수에 저장할 수 있습니다. 어느 시점에서든 하나의 값만 저장할 수 있습니다. 새 값이 할당되면 이전 값이 덮어씁됩니다. 그러나 새 값은 이전 값과 다른 형식을 가질 수 있습니다. 유일한 요구 사항은 형식이 boost::variant을 위해 템플릿 매개 변수로 전달되어야 하므로 boost::variant 변수에 알려져 있습니다.

의도된 것이지만 변형 형식 식이 인스턴스화될 때 binary_op이 여전히 불완전하기 때문에 위의 방법은 컴파일되지 않습니다.