C#에서 하는 만큼 하면 C++에서도 구현할 수 있지요.
가장 간단한 방법은 void*를 이용해서 아무거나 다 담아버리는 거지만, 이렇게 하면 타입안전성을 보장하기 힘들기 때문에, C++에서도 C#처럼 모든걸 담을수 있는 오브젝트 클래스(인터페이스가 더 적합할 수도 있습니다)를 만들고, 오브젝트클래스를 담을 수 있는 배열이든 리스트든 만들면 됩니다.
당연히 오브젝트 클래스는 모든 타입에 대해서 구현되어야하겠지요.
예를 들면,
뭐 이런식으로 되겠죠? ArrayList처럼 첨자 넣으면 자동으로 확장되게 하고 싶다면 ArrayList의 컨테이너로 벡터가 아니라 std::map 같은 걸로 하면 구현은 더 편할테구요.
dynamic_cast나 타입을 나타내는 메타클래스같은걸 Loadable에 넣어두면 형변환 체크도 가능할 겁니다.
동적바인딩을 이용하기 때문에 포인터를 타입으로 받고 있으므로, 그부분은 명세에 적어둬야 할 겁니다.
아니면 스마트포인터를 이용하는 방법도 있을테고요...
요구하는 구체적인 내용에 따라서 단순하게 만들수도 있고, 템플릿도 섞어서 좀더 다양한 기능이나 편리한 기능 지원하게 만들수도 있을겁니다.
어찌되었든, 적재하고 싶은 모든 타입에 대해서 새롭게 Loadable을 상속한 클래스를 만들거나, 모든 타입을 기술할 수 있는 메타 클래스를 만들거나 해야할겁니다.
gilgil.net
C++의 generic programming에서는 compile time에 type이 정해 지게 됩니다(runtime에 정해 지는 게 아니고).
예를 들면 list 혹은 list과 같이 아래와 같이 써야 하죠.
만약에 date type을 명시하지 않으려면 모든 type을 포함하는 type을 사용하면 됩니다.
플랫폼(라이브러리)마다 다른데, Qt의 경우에는 QVariant를 사용하면 되고, 직접 구현하려면 구글링해 보시면 나와 있습니다.
http://www.codeproject.com/Articles/6462/A-simple-class-to-encapsulate-VARIANTs
www.gilgil.net
C#에서 하는 만큼 하면 C++에서도 구현할 수
C#에서 하는 만큼 하면 C++에서도 구현할 수 있지요.
가장 간단한 방법은 void*를 이용해서 아무거나 다 담아버리는 거지만, 이렇게 하면 타입안전성을 보장하기 힘들기 때문에, C++에서도 C#처럼 모든걸 담을수 있는 오브젝트 클래스(인터페이스가 더 적합할 수도 있습니다)를 만들고, 오브젝트클래스를 담을 수 있는 배열이든 리스트든 만들면 됩니다.
당연히 오브젝트 클래스는 모든 타입에 대해서 구현되어야하겠지요.
예를 들면,
뭐 이런식으로 되겠죠? ArrayList처럼 첨자 넣으면 자동으로 확장되게 하고 싶다면 ArrayList의 컨테이너로 벡터가 아니라 std::map 같은 걸로 하면 구현은 더 편할테구요.
dynamic_cast나 타입을 나타내는 메타클래스같은걸 Loadable에 넣어두면 형변환 체크도 가능할 겁니다.
동적바인딩을 이용하기 때문에 포인터를 타입으로 받고 있으므로, 그부분은 명세에 적어둬야 할 겁니다.
아니면 스마트포인터를 이용하는 방법도 있을테고요...
요구하는 구체적인 내용에 따라서 단순하게 만들수도 있고, 템플릿도 섞어서 좀더 다양한 기능이나 편리한 기능 지원하게 만들수도 있을겁니다.
어찌되었든, 적재하고 싶은 모든 타입에 대해서 새롭게 Loadable을 상속한 클래스를 만들거나, 모든 타입을 기술할 수 있는 메타 클래스를 만들거나 해야할겁니다.
두분 모두 감사드립니다.
좋은 정보 주신점 아주 감사드립니다.
"Success"
boost의 recursive variant 있습니다.
Boost.Variant에 recursive variant가 있습니다.
http://www.boost.org/doc/libs/1_51_0/doc/html/variant/tutorial.html#variant.tutorial.recursive.recursive-variant
Life rushes on, we are distracted
댓글 달기