What are the applications of constexpr in C++?
In C++, the constexpr keyword is used to declare constant expressions that can be evaluated at compile time. Here are some scenarios where constexpr is useful:
- Calculating constant values: using constexpr allows for calculating constant values at compile time instead of runtime, which improves program performance. For example, constexpr can be used to calculate the factorial of a number or Fibonacci sequence.
constexpr int factorial(int n) {
return (n <= 1) ? 1 : (n * factorial(n - 1));
}
constexpr int fib(int n) {
return (n <= 1) ? n : (fib(n - 1) + fib(n - 2));
}
int main() {
constexpr int fact5 = factorial(5);
constexpr int fib10 = fib(10);
return 0;
}
- Before C++11, the size of an array had to be a constant expression. By using constexpr, the size of an array can be calculated at compile time.
constexpr int size = 10;
int array[size];
- After C++11, constexpr can be used as a template parameter to make templates more versatile. For example, constexpr can be used as a template parameter to specify the size of an array.
template <int Size>
struct Array {
int data[Size];
};
int main() {
Array<10> arr;
return 0;
}
- For enumerations: using constexpr allows you to declare constants in enumeration types, providing validation at compile time and offering improved type safety.
enum class Color {
RED = 0,
GREEN = 1,
BLUE = 2,
};
constexpr Color mix(Color c1, Color c2) {
return static_cast<Color>(static_cast<int>(c1) | static_cast<int>(c2));
}
int main() {
constexpr Color c = mix(Color::RED, Color::BLUE);
return 0;
}
- For constant functions: By using the constexpr keyword to decorate the function, it ensures that the function is evaluated at compile time and can only accept constant expressions as parameters.
constexpr int square(int n) {
return n * n;
}
constexpr int result = square(5);
These are just some of the applications of constexpr, which can be used in many other situations to improve performance or enhance the readability and maintainability of the code.