U E D R S I H C RSS
ID
Password
Join
대다수란 표현은 침묵하고 있는 사람들을 내 편이라고 주장하기 위해 쓰이고, 일부라는 말은 감추기에는 너무 많기에 도저히 감추지 못할 경우 마지못해 인정할 때 쓰인다. -- kids의 staire 님 글 중에서

[[Include(분류/Cpp)]]

Contents

1 개요
2 선언하는 방법
3 값을 대입하는 방법
4 원래 대입했던 값의 타입을 알아내는 방법
5 값이 비어있는지를 알수 있는 방법

1 개요 #

sqlite이나 다른 스크립트들을 보면 굳이 타입선언을 하지 않고 그냥 배열이나 자료구조를 선언하는 것을 볼 수 있습니다. 효율성은 둘째치고 짜는 사람입장에서 정말 편하죠. :) C++만큼 데이타타입을 엄격히 따지는 언어도 드문 까닭에(const만 빼먹어도 에러가...) 루아나 기타 다른 스크립트와 혼용할 경우 참 깝깝할 때가 많습니다. 예를 들어, vector<>를 하나 선언하고 싶은데 내부 요소들의 데이타 타입이 int, long, float 중 하나가 되게 하고 싶을 경우가 대표적인 예지요. 이것을 가능하게 해주는 것이 any 클래스입니다. 컨테이너이기 때문에 아무래도 단일 데이타 타입 그대로 쓰는 것보다는 효율성이 떨어지지만 융통성있는 코드를 요구할 때 매우 유용하게 써먹을 수 있습니다.

2 선언하는 방법 #

#include <boost/any.hpp>
...
boost::any value_; // 그냥 빈 값을 하나 생성합니다.
boost::any value_int_(16); // 16이란 값을 담고 내부 데이타 타입을 int로 설정합니다.

3 값을 대입하는 방법 #

boost::any value_;
value_ = 14; // 정수형 대입
value_ = 5.67f; // 실수형 대입
value_ = string("테스트"); //문자열 대입
이때 주의해야할 점은 문자열로서 char * 타입은 안된다는 점입니다. any 역시 컨테이너이기 때문에 STL 컨테이너 요건(복사생성자존재, 대입연산자오버로딩존재)과 원래 데이타타입의 소멸에 있어서 예외를 던지지 말 것을 충족해야합니다.

4 원래 대입했던 값의 타입을 알아내는 방법 #

type() 메소드를 사용하면 됩니다. 타입을 알았다면 boost::any_cast<>() 메소드를 사용하여 원래의 타입을 바꾸면 됩니다. 원래의 타입과 달라도 어느정도는 변환이 가능합니다. (예를 들어, int -> any -> long 이런식의 변환은 가능)
boost::any value_;
if (value_.type() == typeid(int)) printf("%d", boost::any_cast<int>(value_));

5 값이 비어있는지를 알수 있는 방법 #

처음 그냥 boost::any를 선언하면 내부에는 값이 설정되어있지 않습니다. 이런 상태 여부는 empty() 메소드로 가려냅니다.
boost::any value_, value2_(16);
if (!value_.empty()) printf("%d", boost::any_cast<int>(value_)); // 절대 출력되지 않습니다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.3410 sec