constexpr를 클래스에 사용
constexpr을 클래스에서 사용하면 클래스를 정수로 사용할 수도 있으며 메타 템플릿 프로그래밍에서는 이전에는 복잡하게 처리하던 것을 아주 간단하게 처리할 수도 있습니다. C++ 메타 템플릿 프로그래밍에 관심이 많구나 자주 사용하고 있는 분들에게는 constexpr 덕분에 프로그래밍이 한결 편해지리라 생각합니다.
아래의 코드는 Integer 이라는 클래스를 constexpr을 사용하여 정수처럼 사용 합니다.
class Integer
{
private :
int value ;
public :
constexpr Integer() : value() { }
constexpr Integer( int value ) : value(value) { }
constexpr operator int() { return value ; }
} ;
int main()
{
constexpr Integer size = 5 ; // 컴파일 타임에 정수로
int x[size] ; // Integer::operator int()가 호출된다
Integer object ; // 일반적인 클래스 인스턴스 화. 실행 시에 처리
int y[object] ; // 당근 에러
}
출처 : http://cpplover.blogspot.com/2010/11/gccniconstexpr.html
또 메타 템플릿 프로그래밍에서는 아래와 같이 사용할 수도 있습니다.
#include <iostream>
struct pi {
static constexpr double value = 3.14;
};
template <const double& r>
struct circle_area {
static constexpr double value = r * r * pi::value;
};
struct radius {
static constexpr double value = 2.5;
};
int main()
{
constexpr double result = circle_area<radius::value>::value;
static_assert(result == 19.625, "not equal");
std::cout << result << std::endl;
}
출처 : http://d.hatena.ne.jp/faith_and_brave/searchdiary?word=constexpr&.submit=%B8%A1%BA%F7&type=detail
constexpr은 컴파일 할 때 결과가 이미 결정 나는 것은 컴파일 타임 때 처리를 해주어 실행 시에 불필요한 처리를 막아주고, 기존의 메타 템플릿 프로그래밍으로 까다롭게 만들었던 것을 아주 쉽게 구현할 수 있게 해줍니다.
C++11에서는 constexpr을 잘 사용하면 기존 보다 더 뛰어난 프로그래밍을 할 수 있으니 깊게 파고들 가치가 있다고 생각합니다.
'C++0x' 카테고리의 다른 글
[ VC11-C++11 ] enum - unscoped enumeration과 scoped enumeration (0) | 2012.07.16 |
---|---|
[미리 보는 C++11] 8. Placement Insert (0) | 2012.02.27 |
[미리 보는 C++11] 3. constexpr - 1 (1) | 2011.09.15 |
[미리 보는 C++11] 2. override와 final (3) | 2011.08.30 |
[미리 보는 C++11] 1. UTF-8, UTF-16(char_16t), UTF-32(char32_t) 문자형 (7) | 2011.08.22 |