페이지

2014년 12월 22일 월요일

constexpr

constexpr (Visual Studio 2015에서 사용가능)

- 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
 
출처 : http://cpplover.blogspot.com/2010/11/gccniconstexpr.html

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

댓글 없음:

댓글 쓰기