VS2010 VC++10 C++ 0x 정리 – 1

1. auto

– 지역변수를 정의 때 명시적으로 타입을 지정하지 않아도 됨.
– 컴파일 타임 때 타입을 결정
– 코딩이 간편해지고, 코드 가독성이 좋아짐
포인터, 참조, const에도 사용 가능하다. 포인터는 *를 포함하지 않아도 &Sample로 값을 할당하기 때문에 포인터로 타입이 결정되지만, 참조인 경우에는 &를 넣지 않으면 참조 타입으로 생성되지 않는다.
int Sample = 10;
auto& SampleRef = Sample;
auto* SamplePtr = &Sample;
클래스 정의에도 사용 가능하다.
auto* newClass = new NewClass();
STL에서도 사용 가능하다. 기존의 긴 iterator을 사용하지 않아도 된다.
auto it = m_listCommand.begin();
2. static_assert
– assert와 비슷한 조건 조사를 할 수 있음
– 컴파일 타임 때 사용하여 프로그램 실행 전에 문제를 찾을 수 있음
– 템플릿 프로그래밍에 사용하면 특히 유용
static_assert(“constant-expression”, “error-message”);
constant-expression가 false일 경우 컴파일러는 에러 메시지를 출력한다.
static_assert는 다음과 같은 경우에 사용하면 유용하다.
  a. 기본 타입(int, long등)이나 유저 정의 타입(class, struct등으로 만든 타입)의 크기를 확인하고 싶을 때
  b. 어떤 타입의 최대 크기를 넘어서는지 확인하고 싶을 때
사용예)
  a. 상수 값의 크기 조사
const int MAX_LEVEL = 120;
static_assert(MAX_LEVEL <= 100, "Warring - MAX_LEVEL");
  b. 변수의 크기 조사
static_assert(sizeof(int) == 4, "not int size 4");
  c. 템플릿에서 사용
template<typename T1, int StaticSize>
class CMyStack
{
static_assert(StaticSize >= 10, "Stack Size Error");
 
public:
CMyStack()
{
}

private:
T1* data;
};

int _tmain(int argc, _TCHAR* argv[])
{
const int UserMode = 14;

CMyStack<int, 5> stack;

getchar();
return 0;
}
3. nullptr
char* p = nullptr;
C++에서는 널 포인터를 나타내기 위해서는 NULL 매크로나 상수 0을 사용하였습니다. 그러나 NULL 매크로나 상수 0을 사용하여 함수에 인자로 넘기는 경우 int 타입으로 추론되어 버리는 문제가 발생하기도 합니다.
바로 이와같은 문제를 해결하기 위해서 nullptr 이라는 키워드가 생겼습니다.
C++0x에서 nullptr의 드래프트 문서를 보면 nullptr은 아래와 같은 형태로 구현 되어 있습니다.
const class {
public:
template <class T>
operator T*() const
{
return 0;
}
template <class C, class T>
operator T C::*() const
{
return 0;
}
private:
void operator&() const;
} nullptr = {};
4. 표현식의 타입을 알려주는 decltype
decltype은 인수(피연산자)로 주어진 표현식의 타입을 알려주는 연산자입니다. 타입 이름을 지정해야 하는 곳에 대신 사용할 수 있습니다.
예:
template<typename T, typename U>  
void f(T x, U y)  
{  
    decltype(x*y) temp = x*y;  
}
성능 관련 사항 하나: decltype(e)에서 표현식 e는 평가되지 않습니다. 위의 예라면 decltype(x*y)에 대해 그 어떤 operator*도 실제로 호출되지 않습니다.
그런데 위와 같은 변수 정의문이라면 그냥
auto temp = x*y;
로 하는 게 더 간결합니다. 새로 선언되는 변수의 타입을 지정하는 용도라면 대부분 decltype보다 auto가 더 간단한 해법일 것입니다. 그러나 타입 추론이 변수 선언에만 필요한 것은 아니기 때문에 auto가 decltype을 완전히 대신할 수는 없습니다.
decltype이 필요한 예로 흔히 반환 형식의 지정을 듭니다. 다음 예를 봅시다.
<template typename T, typename U>
??? f(T x, U y) { return x*y; }
??? 부분에 decltype(x*y)를 넣으면 되겠다는 생각이 들 것입니다:
<template typename T, typename U>
decltype(x*y) f(T x, U y) { return x*y; }
그러나 안타깝게도 이는 “선언되지 않은 이름은 사용할 수 없다”는 규칙을 위반한 코드입니다. decltype(x*y)의 x와 y는 아직 등장한 적이 없으니까요. 이 문제를 해결하기 위해 다시 auto가 등장합니다.
<template typename T, typename U>
auto f(T x, U y) -> decltype(x*y) { return x*y; }
이제는 x와 y가 선언 후에 쓰이므로 문제가 없습니다. 함수(인수목록)-> 반환형식 이라는 구문은 C++0x에 새로 도입되는 함수 선언 구문입니다.
예제코드)
int Hp;
decltype(Hp) NPCHp = 5;
decltype(Hp + NPCHp) TotalHp;
decltype(Hp*) pHp = &Hp;

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다