[C++11] keyword: constexpr
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 |
λκΈ
μ΄ κΈ κ³΅μ νκΈ°
-
ꡬλ
νκΈ°
ꡬλ νκΈ°
-
μΉ΄μΉ΄μ€ν‘
μΉ΄μΉ΄μ€ν‘
-
λΌμΈ
λΌμΈ
-
νΈμν°
νΈμν°
-
Facebook
Facebook
-
μΉ΄μΉ΄μ€μ€ν 리
μΉ΄μΉ΄μ€μ€ν 리
-
λ°΄λ
λ°΄λ
-
λ€μ΄λ² λΈλ‘κ·Έ
λ€μ΄λ² λΈλ‘κ·Έ
-
Pocket
Pocket
-
Evernote
Evernote
λ€λ₯Έ κΈ
-
[C++] keyword: static_cast, dynamic_cast, reinterpret_cast, const_cast
[C++] keyword: static_cast, dynamic_cast, reinterpret_cast, const_cast
2020.07.23 -
[C++] keyword: noexcept
[C++] keyword: noexcept
2020.07.23 -
[C++] keyword: using
[C++] keyword: using
2020.07.23 -
[C++] keyword: friend
[C++] keyword: friend
2020.07.23