template<int T>
struct Fibonacci
{
enum{value = (Fibonacci<T - 1>::value + Fibonacci<T - 2>::value)};
}
template<>
struct Fibonacci<0>
{
enum{value = 1};
}
template<>
struct Fibonacci<1>
{
enum{value = 1};
}
template<>
struct Fibonacci<2>
{
enum{value = 1};
}
int num =0;
std::cin >> num;
std::cout << Fibonacci<num>::value << std::endl;// Error 발생
컴파일과 런타임에도 모두 사용 할 수 있는 constexpr
constexpr unsigned int Fibonacci(unsigned int i)
{
return (i <= 1u) ? i : (Fibonacci(i - 1) + Fibonacci(i -2));
}
Ex)
constexpr unsigned int Fibonacci(unsigned int i)
{
return (i <= 1u) ? i : (Fibonacci(i - 1) + Fibonacci(i -2));
}
int main()
{
int value = 3;
int result = Fibonacci(value);// OK, 컴파일 중에 결정 못 하니까 함수 호출
// Error, result2 변수를 반드시 컴파일 시점에 결정해야 하는데 못 하니까 Error
constexpr int result2 = Fibonacci(value);
// OK, 컴파일 중에 함수 계산해서 결정할 수 있으니까, 그리고 변수에도 컴파일중게 값 결정 할 수 있으니까.
constexpr int result3 = Fibonacci(3);
}
constexpr int result3 = Fibonacci(30) ;
//재귀함수 너무 돌리면 컴파일이 뻗을 수 있다.
//const expression must have a constant Value
//expression did not evaluate to a constant
const : 변경을 불허 한다
constexpr : 컴파일 시에 계산했으면 좋겠음
서로 같지 않다 !!!
결국 둘다 const 이다
const int num = 10;
num = 20;// Error
constexpr int num1 = 20;
num1 = 30;// Error
int num2 = 30;
constexpr int num3 = num2;// Error
const int num4 = 40;// OK
constexpr int num5 = num4;// OK
constexpr int num6 = 60;// OK
constexpr int num7 = num6;// OK
constexpr int Fibonacci(int num);// OK
int Fibonacci(int num) const;// error, 비멤버함수라서
constexpr int Champion::GetWinCount()// OK
{
mWinCount = 10;
return mWinCount;
}
constexpr int Champion::GetWinCount() const// Error, 멤버 변수를 바꾸고 있음.
{
mWinCount = 10;
return mWinCount;
}
class FixedArray
{
public:
private:
enum { MAX = 10 };
int mSize;
int mArray[MAX];
}
class FixedArray
{
public:
private:
static constexpr int MAX = 10;
int mSize;
int mArray[MAX];
}