비트연산자를 통한 프로퍼티 구현

2008/02/29 22:53
자주 확인하지 않는 프로퍼티들이 bool 값으로 들어있는것은 아깝다. 이때는 비트연산자를 이용해서 프로퍼티들 관리하는것이 좋다.

(Language : cpp)
enum PROP
{
    PROP_1 = 1 << 1,
    PROP_2 = 1 << 2
};

int g_prop = 0;

void AddProperty(PROP _eProp)
{
    g_prop |= _eProp;
}

void RemoveProperty(PROP _eProp)
{
    g_prop &= ~_eProp;
}

bool QueryProperty(PROP _eProp)
{
    if( (g_prop & _eProp) == _eProp )
        return true;
    return false;
    // 혹은
    // return (g_prop & _eProp) ? true : false;
}

프로그래밍 C/C++, 프로그래밍

#pragma warning( disable / default : 4312 )

2007/11/23 15:46
HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(m_hWnd, GWLP_HINSTANCE);
이런종류에서 나타나는 warning을 어떻게 없앨까?
상당히 고민했었는데, Debugging Applications Windows라는 책에서는 #pragma를 사용해서 해결했더라.

#pragma warning( disable : 4312 )
HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(m_hWnd, GWLP_HINSTANCE);
#pragma warning( default : 4312 )

프로그래밍 C/C++

template template parameter (TTP, 템플릿템플릿 인자)

2007/07/29 22:03
템플릿 선언에서 "이것은 템플렛으로 사용되도록 넘겨진다"를 선언 하는것이 TTP 이다.

template<template <class T> class X> class A { };
template<class T> class B { };
A<B> a;

살펴볼점이, B가 template 임에도 불구하고 a를 선언하는 시점에서는 B를 템플릿으로 안써야 된다는것.
또, class A의 인자는 템플릿에어야 한다는것.
이점을 ModernC++디자인에서는 단위전략클래스(PolicyClass)라는 곳에서 효과적으로 이용한다.


class Widget;
template <template <typename T> class TemplateParam>
class TTP
{
TemplateParam<Widget> a;
};

template < typename T >
class TemplateParamA
{
};

class TemplateParamB
{
};

int main(int argc, char* argv[])
{
TTP<<emplateParamA> a;
//TTP<TemplateParamB> b; //compile error!
return 0;
}

위의 코드를 보면, 템플릿템플릿 인자를 통해 헤더 의존성을 줄일수 있고, 템플릿 특화에서도 템플릿템플릿 인자를 사용할수 있을듯하다.

IBM사에서 설명하는 TTP
Comeau 컴파일러 TTP 설명

프로그래밍 C/C++

클래스 생성과정을 강제하기

2007/05/04 00:02
매니저로 관리되는 클래스들의 생성과정을 Template Method 등으로 강제하면 '이곳에서 만들자'가 정해지므로 만드는것에만 집중할 수 있을것이다.

문제는 상속받아 쓰는 쪽에서 어떻게 이렇게 해라~ 를 강제시키는가인데.. 어떤면에서 상속가능한 객체를 힙에만 생성하기와 비슷한 문제이다.

일단 런타임시에 assert를 내는것으로 의도를 전하는데에 중심을 둔버전


class manager;
class managedInterface
{
friend class manager;
public:
managedInterface()
{
assert( CREATE_TEST == READY_TO_CREATE );
}
private:
enum CREATE_TEST_TYPE
{
READY_TO_CREATE = 0,
NEED_TO_SET
};
enum { MANAGED = 1 };
static CREATE_TEST_TYPE CREATE_TEST;
protected:
// 추상
virtual void OnCreate() = 0;
};
// 할당이 아닌 초기화를 위해서는 반드시 앞에 타입을 붙여준다.
managedInterface::CREATE_TEST_TYPE managedInterface::CREATE_TEST = managedInterface::NEED_TO_SET;

class managedImpl : public managedInterface
{
public:
// 속성
// managedImpl 하고 싶은것들
void runAndGun(){}

private:
// 구현
virtual void OnCreate(){}
};

class manager
{
public:
template
T* getManaged()
{
managedInterface::CREATE_TEST = managedInterface::READY_TO_CREATE;
T* pType = new T;
assert(T::MANAGED);
managedInterface::CREATE_TEST = managedInterface::NEED_TO_SET;
return pType;
}

static manager& getInstance()
{
static manager a;
return a;
}
};

int main()
{
//이렇게 하면 어써션이 뜬다.
//managedImpl* p = new managedImpl;

//이렇게 하면 어써션이 안뜬다.
managedImpl* p = manager::getInstance().getManaged();
managedImpl* pp = manager::getInstance().getManaged();

// 다시 이렇게 하면 어써션이 뜬다.
//managedImpl* pp = new managedImpl;
return 0;
}


어쨌든 의도는 전해질 것이고.. 코드또한 무겁지 않으니.. 이방법을 써먹어 봐야겠다.

프로그래밍 C/C++, 프로그래밍

오늘 배운 내용들.

2006/12/03 02:02
1. wchar_t 와 인코딩과의 관계.
예전부터 많이 헷갈렸런 내용인데, 어느정도 정리를 해서 위키에 올렸다. 배우면서 든 생각은 인코딩 라이브러리를 공부해야 겠다는 것하고 왠만하면 xml로 저장을 해서 xml 파서에게 인코딩 책임을 떠넘겨야 겠다는것...(-_-)

2. python에서 왜 a, b = b, a 로 swap 이 되는가? (packing / unpacking 의 개념)
언제나 궁금했던 내용인데, 열혈강의 파이썬에 나와 있던 내용. IDLDE 에서 바로 확인해봤다.

IDLE 1.2
>>> a = ["hi" , "there"]
>>> a
['hi', 'there']
>>> [b, c] = a
>>> b
'hi'
>>> c
'there'
>>> a
['hi', 'there']
>>> [b] = a

Traceback (most recent call last):
File "", line 1, in
[b] = a
ValueError: too many values to unpack
>>>

좌변값, 우변값에 "할당" 이라는 개념만으로 이해하려 했으니, 당연히 안되었던것. 이걸로 python 혐오증(?)도 조금 나아지려나.

프로그래밍 C/C++, python