Visual Studio 2010의 가장 큰 특징중의 하나는 바로 C+0 Lamda  표현식을 사용할 수 있는 거다.

이 Lamda 표현식은 다른 언어 특히 루비나 파이썬과 같은 프로그래밍 언어에서 많이 사용하는 문법이었는데 지금까지 C++에서는 이 편리한 Lamda 표현식을 지원하지 않다가 이제서야 지원하게 되었다.

Lamda 표현식에 대해서는 인터넷에 자료가 널려 있기 때문에 더이상 설명하지 않는다. 구글링을 하기 바란다.


Lamda 표현식을 내가 만든 프로그램에서 사용하기 위해서는 다음과 같은 과정을 따르면 된다.


1. #include <functional>

2. typedef 을 이용해서 람다 함수 원형을 정의 한다.
3. 함수의 인자로 람다 Functor 를 입력받고 이를 활용하면 된다.


여기서 설명하는 C+0 Lamda 표현식은 MS 개발툴의 경우 VS2010 이상에서만 가능하다.




====================== 헤더 파일 선언 내용 ======================
#include <functional>

template<class _Fn1> inline
BOOL CALLBACK EnumControlsProcLamda(HWND hWnd, _Fn1 * func)
{
	(*func)(hWnd);
	return true;
}
template<class _Fn1> inline
void EnumAllControls(CWnd * pWnd, _Fn1 _Func)
{
	EnumChildWindows(pWnd->GetSafeHwnd(), (WNDENUMPROC)EnumControlsProcLamda<_Fn1>, (LPARAM)&_Func);
}



====================== 사용 방법 ======================
.
.
.
// 모든 자식 컨트롤 true로 만들기
// 람다 함수 내에서 지역변수 Capture가 필요하면 [=]혹은 [&]을 이용한다.
EnumAllControls( [](HWND h){
	if( h )
	{
		if( !IsWindowEnabled(h) )
		{
			EnableWindow(h);
		}
	}
});




====================== 함수 실행 시간 구하는 Lamda함수  ======================


template <class Function>
__int64 time_call(Function&& f)
{
   __int64 begin = GetTickCount();
   f();
   return GetTickCount() - begin;
}





C++의 RTTI는 정말 편리하다.

프로그램 실행중에 변수의 자료형을 확인할 수 있으니 말이다.

RTTI는 C++ 표준서 및 MFC RTTI 지원 문서를 참고하자.


C++ RTTI : http://sweeper.egloos.com/2826160

MFC RTTI : http://anster.egloos.com/2173004


그런데 써본 사람들은 알겠지만, 이 MFC의 RUNTIME_CLASS() 매크로는 속도도 빠르고 좋은데

문제는 내포 클래스(혹은 중첩 클래스라고 말하기도 한다)에는 사용할 수 없다.

내포 클래스란...? http://initial4-blog.blogspot.kr/2012/06/c-study-512-part.html


내포 클래스는 용도에 따라서 매우 유용한 클래스인데, 이런 내포(중첩)클래스에서도 RTTI를 사용할 수 있도록 MFC의 RUNTIME_CLASS를 약간 수정해 보았다.



IMPLEMENT_DYNAMIC_NESTED() 의 사용방법은 다음과 같다.


IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)

=> nesting_class는 내부 클래스를 감싸는 외부 클래스

=> class_name은 외부 클래스 안에 있는 내포 클래스 즉, 중첩 클래스

=> base_class_name은 내포 클래스 즉, 중첩 클래스가 상속하고 있는 부모 클래스.


아래는 사용 예를 보여준다.





----------------  헤더파일에 추가할 내용 ----------------

#define RUNTIME_CLASS_NESTED(nesting_class, class_name) ((CRuntimeClass*)(&nesting_class::class_name::class##class_name))


#if _MSC_VER >= 1600
#define IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)\
					CRuntimeClass* nesting_class::class_name::GetRuntimeClass() const \
						{ return RUNTIME_CLASS_NESTED(nesting_class, class_name); } \
					CRuntimeClass* PASCAL nesting_class::class_name::GetThisClass() \
						{ return RUNTIME_CLASS_NESTED(nesting_class, class_name); }
#else
#define IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)\
					CRuntimeClass* nesting_class::class_name::GetRuntimeClass() const \
						{ return RUNTIME_CLASS_NESTED(nesting_class, class_name); } 
#endif




#ifdef _AFXDLL
#define IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, wSchema, pfnNew) \
	CRuntimeClass* PASCAL nesting_class::class_name::_GetBaseClass() \
		{ return RUNTIME_CLASS(base_class_name); } \
	AFX_COMDAT const AFX_DATADEF CRuntimeClass nesting_class::class_name::class##class_name = { \
		#class_name, sizeof(class nesting_class::class_name), wSchema, pfnNew, \
			&nesting_class::class_name::_GetBaseClass, NULL }; \
	IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)



#else
#define IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, wSchema, pfnNew) \
	AFX_COMDAT const AFX_DATADEF CRuntimeClass nesting_class::class_name::class##class_name = { \
		#class_name, sizeof(class nesting_class::class_name), wSchema, pfnNew, \
			RUNTIME_CLASS(base_class_name), NULL }; \
	IMPLEMENT_RUNTIME_GETRUNTHISCLASS(nesting_class, class_name, base_class_name)



#endif

#define IMPLEMENT_DYNAMIC_NESTED(nesting_class, class_name, base_class_name) \
	IMPLEMENT_RUNTIMECLASS_NESTED(nesting_class, class_name, base_class_name, 0xFFFF, NULL)




----------------  사용하는 방법 예제 ----------------



A.h

class CA : public CObject
{
public:
	DECLARE_DYNAMIC(CA)

	CA(){}
	virtual ~CA(){}
	
	
	
private:
	class CANested : public CObject
	{
	public:
		DECLARE_DYNAMIC(CANested)
		CANested() {}
		virtual ~CANested() {}
		
		
	};

};






A.cpp

IMPLEMENT_DYNAMIC(CA, CObject)
IMPLEMENT_DYNAMIC_NESTED(CA, CANested, CObject)




저는 예전 모토로라 아트릭스 시절부터 SWYPE 키보드를 사용해 왔습니다.

한 손으로 입력이 가능한게 바로 Swype 키보드였거든요

처음에는 불편하다가 한번 익숙해 지니 다른 키보드는 쓰기 불편해 지더군요.

아트릭스때에는 기본 앱으로 Swype가 있어서 기간 제한 없이 잘 사용했는데

이후 기기들은 기본앱이 아니라 평가판을 사용해서 기간제한(딱 1달)때문에 지우고 다시 설치하기 무지 불편하더라구요

앱 삭제 않고 계속 쓰는 방법을 알려드리겠습니다.

프로그램 크랙이 아닙니다.


우선 루팅폰이어야 합니다.


준비물 : Swype + Dragon Trial  +  Root Explorer


앱 다운로드 주소 : 

    1. Swype Dragon Trial => https://play.google.com/store/apps/details?id=com.nuance.swype.trial&hl=ko

    2. Root Explorer => https://play.google.com/store/apps/details?id=com.speedsoftware.rootexplorer&hl=ko



1. 어플 서랍에서 Root Explorer와 Swype가 있어야죠.



2. Root Explorer를 실행합니다.



3. /data/data/com.nuance.swype.trial/shared_prefs  폴더로 이동합니다.



4. 이동 후 "com.nuance.swype.trial_preferences.xml" 파일을 삭제하시든지 아니면 다른 이름으로 변경하세요.


5. 폰을 리부팅 합니다.


6. Swype Trial이 새로 설치 된 것 처럼 1달 더 쓸 수 있어요.

+ Recent posts