http://msdn2.microsoft.com/en-us/library/ms177194.aspx

gpg에 답변달다가 홈피에도 없는것 같길래 포스팅
boost를 대체할수 있는 기본 키워드들이 꽤 있다.
컴파일러에서 처리를 해주니 왠지 boost보다 가볍지 않을까...하는 느낌..

'자료 > Article' 카테고리의 다른 글

Utilities for STL std::string  (1) 2007.03.27
/ENTRY(진입점 기호)  (2) 2007.03.01
Subversion(SVN)과 Mantis의 연동  (2) 2007.01.05
라그나로크2 클라이언트 분석  (2) 2006.12.31
[펌] 디스크 캐쉬 제대로 알기  (2) 2006.12.29

//////////////////////////////////////////////////////////////////
//
// MSB : most significant bit/byte
//
// bit : 최상위 비트
// byte : 최상위 바이트
//
// MSB<0>::bit == 0
// MSB<0>::byte == 0
// MSB<1>::bit == 1
// MSB<1>::byte == 1
// MSB<0x100>::bit == 9
// MSB<0x100>::byte == 2
// MSB<0x101>::bit == 9
// MSB<0x101>::byte == 2
// MSB<0x10000000>::bit == 32
// MSB<0x10000000>::byte == 4
// MSB<0x10000001>::bit == 32
// MSB<0x10000001>::byte == 4
//
//////////////////////////////////////////////////////////////////

template<DWORD N>
struct MSB
{
static unsigned const bit = MSB<(N>>1)>::bit + 1;
static unsigned const byte = MSB<(N>>8)>::byte + 1;
};

template<>
struct MSB<0>
{
static unsigned const bit = 0;
static unsigned const byte = 0;
};


//////////////////////////////////////////////////////////////////
//
// LSB : least significant bit/byte
//
// bit : 최하위 비트
// byte : 최하위 바이트
//
// LSB<0>::bit == 0
// LSB<0>::byte == 0
// LSB<1>::bit == 1
// LSB<1>::byte == 1
// LSB<0x100>::bit == 9
// LSB<0x100>::byte == 2
// LSB<0x101>::bit == 1
// LSB<0x101>::byte == 1
// LSB<0x10000000>::bit == 32
// LSB<0x10000000>::byte == 4
// LSB<0x10000001>::bit == 1
// LSB<0x10000001>::byte == 1
//
//////////////////////////////////////////////////////////////////

template<DWORD N>
struct LSB_temp
{
static unsigned const bit = LSB_temp<(N<<1)>::bit + 1;
static unsigned const byte = LSB_temp<(N<<8)>::byte + 1;
};

template<>
struct LSB_temp<0>
{
static unsigned const bit = 0;
static unsigned const byte = 0;
};

template<DWORD N>
struct LSB
{
static unsigned const bit = 33-LSB_temp<N>::bit;
static unsigned const byte = 5-LSB_temp<N>::byte;
};

template<>
struct LSB<0>
{
static unsigned const bit = 0;
static unsigned const byte = 0;
};

'자료 > 내자료' 카테고리의 다른 글

SPE V1 - 길찾기용 지형구조  (9) 2006.12.10
게임을 위한 GUI모듈  (4) 2006.07.31
is_template  (0) 2006.05.10
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
enum string  (0) 2005.07.08

template<typename EnumType, EnumType EnumMax, template<typename, EnumType> class ContainerType >
class SEnum
{

...

};

이런 형태의 템플릿을 사용하고 있는데
자동화 코드에서 컴파일 타임에 이 템플릿으로 정의된 type인가..를 검사를 해야 했었다.

그래서 심플하게 인터페이스 클래스를 만들어서 상속받고 그 인터페이스 클래스를 Driven한 클래스인가...를 검사하는 방법으로 갔었다.

그르나-_-

사태는 그리 쉽게 흘러갈리 없고
인터페이스 클래스를 상속 받으면 안되는 상황이 발생하였다!! 두둥!!!

결국은 한시간여의 삽질 끝에 이런 코드를 만들어 냈다.

template<typename T>
struct SEnumTraits
{
enum { value = false };
};

template<typename EnumType, EnumType EnumMax, template<typename, EnumType> class ContainerType>
struct SEnumTraits< SEnum<EnumType, EnumMax, ContainerType> >
{
enum { value = true };
};

#define is_SEnum(T) ( SEnumTraits<T>::value )

이로써 상속을 안 받고 특정 템플릿을 사용한 type인지를 알 수 있게 되었다.
템플릿 인자가 제멋대로라 generic한 is_template는 실패-_-;

어쨋건 관련 코드들을 싹 새로 정리해야 하는 위기에 처했다....;;
이번주는 계속 메타때매 시간 다 쓰네.. 헹~

'자료 > 내자료' 카테고리의 다른 글

게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
enum string  (0) 2005.07.08
텍스쳐 포맷 변경해서 저장하기  (0) 2005.05.16

아아 요새 계속 먼가 자동화코드들을 만들다 보니
메타 프로그래밍을 대충-_-공부해놨던것들이 계속 걸림돌이 된다.

Modern C++ Design은 사실 메타를 공부하기는 너무 어려운 책이다.
보고 보고 또 봐서 대충의 사용은 하지만 사실 Loki에 있는 것들중에 제대로 활용하는것은 거의 없었다.

Loki에서는 TypeTraits들만 간간히 사용하고 있었는데
사실 처음에 boost에 있는 TypeTraits를 쓸까 하다가 boost의 코드는 공부용으로는 좋지 않아서
Loki를 사용하고 있었는데 결국은 boost로 전환해야겠다.
Loki는 아무래도 빠진 기능이 꽤 많아서 가끔 필요한건 추가해서 썼었는데-_-
이젠 공부용으로만 쓰고 걍 boost의 TypeTraits를 써야겠다..

어쨋건 힘에 부쳐서 요즘 들어 C++ Template Metaprogrammings라는 책을 보고 있는데
내용은 꽤 쉽고 잘 설명되어 있어서 메타프로그래밍을 공부하기에는 꽤 좋을것 같다모던은 너무 어려워 ~(-_-)~

이럴때 승명군이 있으면 쓱싹쓱싹 쉽게 해결해 줄텐데 ㅎㅎ

'게임개발 > 생각' 카테고리의 다른 글

사실은  (4) 2006.10.21
개인적인 욕심  (1) 2006.10.10
공개 UI모듈  (0) 2006.01.03
자꾸 IK가 하고 싶어진다-_-;  (0) 2005.12.12
나쁜 아이디어를 위한 좋은 방법  (0) 2005.12.08


2005.06.06 : 생성
2005.06.07 : lib에서 사용할 때의 버그 수정
2005.07.07 : 직접 스트링을 지정할 수 있도록 추가
2005.07.08 : type명 제외하고 사용하도록 수정
2005.07.08 : 버그 수정및 검증 루틴 추가

enum을 스트링으로 바꾸거나 스트링을 enum으로 바꾸는 문제에 대해서 계속 고민해왔는데.
결론은 내부에 map이 필요하다..였다.

map에 enum과 스트링을 연결시켜주는건 직접 해주는 방식으로 사용했었는데..
흐음..어쨋건 정리된 소스를 받아보시라

사용방법은 두가지 인데.

1번째 방법은 매크로 함수의 특성상 127개의 인자밖에 못받는다.
100개까지 받도록 정의해 놓았다.
2번째 방법의 개수의 제한이 없지만 1번째 방법이 기존의 enum에서 약간만 바꾸면 되는 반면
2번째 방법은 좀 더-_- 바꿔야 한다.

아래와 같이 사용할 수 있다.

// solution 1 limit size 100
SENUM_3( MODE, 1, 2, 3 );
// solution 2 no limit
#define ENUM_BODY_MODE( value ) ENUM_BODY( MODE, value )
#define SENUM_ADD_MODE( value ) SENUM_ADD( MODE, value )

#define MODE_ENUM_LIST( _ ) \
_( 1 )  \
_( 2 )  \
_( 3 )
DEFINE_ENUM( MODE, MODE_ENUM_LIST );

// use
auto define MODE_MAX : 3 not match string
const tstring& str1 = MODE_CONVERTER( MODE_1 );  // return "1"
MODE m = MODE_CONVERTER( _T( "1" ) );   // return MODE_1 : 0

// solition 3 is same soulution 2 but can use special string

#define ENUM_BODY_MODE( value, str ) ENUM_BODY_PAIR( MODE, value, str )
#define SENUM_ADD_MODE( value, str ) SENUM_ADD_PAIR( MODE, value, str )

#define MODE_ENUM_LIST( _ ) \
_( A, a )  \
_( B, b )  \
_( C, c )
DEFINE_ENUM( MODE, MODE_ENUM_LIST );

// use
auto define MODE_MAX : 3 not match string
const tstring& str1 = MODE_CONVERTER( MODE_A );  // return "a"
MODE m = MODE_CONVERTER( _T( "a" ) );   // return MODE_A : 0

ps. 자료를 함께 찾아주신 박대중 과장님께 감사의 말씀을 :)

'자료 > 내자료' 카테고리의 다른 글

is_template  (0) 2006.05.10
분절 모델의 접합부위 Normal값 수정  (0) 2006.02.23
텍스쳐 포맷 변경해서 저장하기  (0) 2005.05.16
Alkanoid프로젝트 완료  (0) 2004.12.23
DX에서 쓰는 텍스쳐 썸네일 만들기  (0) 2004.10.02

꺄악~ 류광씨 멋져~

+ Recent posts