κΈ€ μž‘μ„±μž: λ˜₯폴베.
λ°˜μ‘ν˜•

1. μ„€λͺ…


 constexpr ν‚€μ›Œλ“œλŠ” κ°μ²΄λ‚˜ ν•¨μˆ˜ μ•žμ— 뢙일 수 μžˆλŠ” ν‚€μ›Œλ“œλ‘œ, ν•΄λ‹Ή κ°μ²΄λ‚˜ ν•¨μˆ˜μ˜ 리턴 값을 컴파일 νƒ€μž„μ— 값을 μ•Œ 수 μžˆλ‹€λŠ” 의미λ₯Ό μ „λ‹¬ν•œλ‹€.

 

int arr[size];

 μœ„ λ°°μ—΄ 선언식이 컴파일되기 μœ„ν•΄μ„œλŠ” sizeκ°€ μ •μˆ˜ μƒμˆ˜ 식이여야 ν•˜κ³ 

 

template <int N>
struct A {
  int operator()() { return N; }
};
A<number> a;

 ν…œν”Œλ¦Ώ νƒ€μž… 인자의 κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‘œ numberκ°€ μ •μˆ˜ μƒμˆ˜μ‹μ΄μ—¬λ§Œ ν•œλ‹€. κ·Έ 외에도,

 

enum A { a = number, b, c };

 enumμ—μ„œ 값을 지정해쀄 λ•Œμ— μ˜€λŠ” number μ—­μ‹œ μ •μˆ˜ μƒμˆ˜ μ‹μ΄μ—¬λ§Œ ν•œλ‹€.

 

 

 constexpr은 μ•žμ„œ λ§ν•œ λŒ€λ‘œ, μ–΄λ– ν•œ 식이 μƒμˆ˜μ‹μ΄λΌκ³  λͺ…μ‹œν•΄μ£ΌλŠ” ν‚€μ›Œλ“œλ‹€.

#include <iostream>

using namespace std;

template <int N>
struct A 
{
	int operator()() { return N; }
};

int main() 
{
	constexpr int size = 3;
	int arr[size];  // Good!

	constexpr int N = 10;
	A<N> a;  // Good!
	std::cout << a() << std::endl;

	constexpr int number = 3;
	enum B { x = number, y, z };  // Good!
	std::cout << B::x << std::endl;
}
10
3

 

 constexpr ν‚€μ›Œλ“œλ₯Ό ν™œμš©ν•΄ 컴파일 νƒ€μž„ μƒμˆ˜μΈ 객체λ₯Ό λ§Œλ“œλŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

#include <iostream>

using namespace std;

constexpr int factorial(int n) 
{
    int total = 1;
    for (int i = 1; i <= n; i++) {
        total *= i;
    }
    return total;
}

template <int N>
struct A 
{
    int operator()() { return N; }
};

int main() 
{
	A<factorial(10)> a;

    cout << a() << endl;

    return 0;
}
3628800

 

 C+11μ—μ„œ constexpr이 처음 λ„μž…λ˜μ—ˆμ„ λ•ŒλŠ” μ—¬λŸ¬ μ œμ•½ 쑰건이 λ§Žμ•˜λ‹€. 예λ₯Ό λ“€μ–΄ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³€μˆ˜λ“€μ„ μ •μ˜ν•  수 μ—†κ³ , return문은 λ”± ν•˜λ‚˜λ§Œ μžˆμ–΄μ•Όλ§Œ ν–ˆλ‹€.

 

 ν•˜μ§€λ§Œ C++14λΆ€ν„° μœ„μ™€ 같은 μ œμ•½ μ‘°κ±΄λ“€μ˜ μ™„ν™”λ˜μ–΄ μ•„λž˜μ™€ 같은 μ œμ•½ 쑰건듀 λΉΌκ³ λŠ” λͺ¨λ‘ constexpr ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

  • gotoλ¬Έ μ‚¬μš©

  • μ˜ˆμ™Έ 처리(tryλ¬Έ; C++20λΆ€ν„° κ°€λŠ₯ν•˜κ²Œ λ°”λ€œ)

  • λ¦¬ν„°λŸ΄ νƒ€μž…μ΄ μ•„λ‹Œ λ³€μˆ˜μ˜ μ •μ˜

  • μ΄ˆκΈ°ν™”λ˜μ§€ μ•ŠλŠ” λ³€μˆ˜μ˜ μ •μ˜

  • μ‹€ν–‰ 쀑간에 constexpr이 μ•„λ‹Œ ν•¨μˆ˜λ₯Ό 호좜

 λ§ŒμΌ 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ” μž‘μ—…μ„ ν•¨μˆ˜ λ‚΄μ—μ„œ ν•˜κ²Œ λœλ‹€λ©΄ 컴파일 νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

 

 

 constexpr ν•¨μˆ˜μ— 인자둜 컴파일 νƒ€μž„ μƒμˆ˜λ“€μ„ μ „λ‹¬ν•˜λ©΄, κ·Έ λ°˜ν™˜ κ°’ μ—­μ‹œ 컴파일 νƒ€μž„ μƒμˆ˜κ°€ λœλ‹€. λ°˜λŒ€λ‘œ 컴파일 νƒ€μž„ μƒμˆ˜κ°€ μ•„λ‹Œ 값을 μ „λ‹¬ν•œλ‹€λ©΄ λŸ°νƒ€μž„μ—μ„œ ν•¨μˆ˜κ°€ μž‘λ™ν•œλ‹€. λ”°λΌμ„œ constexpr을 ν•¨μˆ˜μ— 뢙일 수 μžˆλ‹€λ©΄ λΆ™μ—¬μ£ΌλŠ” 것이 μ’‹λ‹€.

 

 

 if constexpr

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
void show_value(T t)
{
	if (std::is_pointer<T>::value) {
		std::cout << "포인터 이닀 : " << *t << std::endl;
	}
	else {
		std::cout << "포인터가 μ•„λ‹ˆλ‹€ : " << t << std::endl;
	}
}

int main()
{
	int x = 3;
	show_value(x);

	int* p = &x;
	show_value(p);
    
    return 0;
}

 std::is_pointerλŠ” μ „λ‹¬ν•œ 인자 Tκ°€ 포인터라면 valueκ°€ trueκ°€ 되고 μ•„λ‹ˆλ©΄ falseκ°€ λ˜λŠ” ν…œν”Œλ¦Ώ 메타 ν•¨μˆ˜λ‹€. μœ„μ™€ 같은 μ½”λ“œλŠ” 컴파일 νƒ€μž„μ— 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

 

 T에 포인터가 μ•„λ‹Œ intκ°€ λ“€μ–΄κ°„λ‹€κ³  κ°€μ •ν•˜λ©΄, if문이 falseκ°€ 되고 trueꡬ문은 μ‹€ν–‰λ˜μ§€ μ•ŠμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  intνƒ€μž…μ— *μ—°μ‚°μžκ°€ λΆ™κ²ŒλΌ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

 

 ν•˜μ§€λ§Œ 이 λ¬Έμ œλŠ” if constexprλ₯Ό λ„μž…ν•˜λ©΄ κΉ”λ”ν•˜κ²Œ ν•΄κ²°λœλ‹€.

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
void show_value(T t)
{
	if constexpr (std::is_pointer<T>::value) 
    {
		std::cout << "포인터 이닀 : " << *t << std::endl;
	}
	else
    {
		std::cout << "포인터가 μ•„λ‹ˆλ‹€ : " << t << std::endl;
	}
}

int main()
{
	int x = 3;
	show_value(x);

	int* p = &x;
	show_value(p);
}
포인터가 μ•„λ‹ˆλ‹€ : 3
포인터 이닀 : 3

 if constexpr은 쑰건이 λ°˜λ“œμ‹œ bool둜 νƒ€μž… λ³€ν™˜λ  수 μžˆμ–΄μ•Ό ν•˜λŠ” 컴파일 νƒ€μž„ μƒμˆ˜ 식이 μ–΄μ•Ό ν•œλ‹€. 쑰건에 ν•΄λ‹Ήλ˜μ§€ μ•ŠλŠ” λ¬Έμž₯은 μ»΄νŒŒμΌλ˜μ§€ μ•Šκ³  μ™„μ „νžˆ λ¬΄μ‹œν•œλ‹€.

 

 

 

2. 참고 및 좜처


https://modoocode.com/293
λ°˜μ‘ν˜•

'Language > C++' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[C++] keyword: static_cast, dynamic_cast, reinterpret_cast, const_cast  (0) 2020.07.23
[C++] keyword: noexcept  (0) 2020.07.23
[C++] keyword: using  (0) 2020.07.23
[C++] keyword: friend  (0) 2020.07.23
[C++] keyword: static  (0) 2020.07.23