- Compile 타임에 변수, 함수, class 등을 상수로 처리함
- 기존의 #define 이나 template 를 대체 할 수 있음
1. 변수에 사용
constexpr int a = 1; // const int a = 1; 과 같음 |
그러나 다음과 같은 대입은 안된다.
int a = 1; constexpr int b = a; // error |
2. 함수에 사용
함수 본체는 반드시 return expression; 형태가 되어야 한다.
constexpr double pow(double a, size_t b)
{
return b != 1 ? a * (b - 1) : a;}
double a = pow(3.0, 6); |
그리고 그 동안 불가능 했던, 배열의 갯수를 함수에서 return 받는 것도 가능해 졌다.
constexpr int GetNum(size_t a)
{
return a * 1024;}
double aFreq[ GetNum(512) ]; |
3. class에 사용
class에 사용하면 Compile 타임에 class를 정수로 만들 수도 있고, 그동안 복잡하게 사용했단 template meta programming 도 좀 더 편리하게 사용이 가능하다.
class를 정수처럼 사용하는 예제
class Integer
{
private:
int value;
public:
constexpr Integer() : value() { }
constexpr Integer(int value) : value(value) { }
constexpr operator int() { return value; }
};
constexpr Integer size = 5; // class를 const int 화int x[size]; // Integer::operator int()가 호출된다 Integer object; // 일반적인 클래스 인스턴스 화. 실행 시에 처리int y[object]; // error : expected constant expression |
meta template programming에서 사용한 예
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;
};
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
댓글 없음:
댓글 쓰기