C++でconstexprがどんな場面で使われるのか、どんな場面ですか。
C++において、constexprキーワードはコンパイル時に評価可能な定数式を宣言するために使用されます。以下はconstexprの使用例です:
- constexprを使用すると、定数値をコンパイル時に計算でき、実行時ではなくなります。これにより、プログラムの性能が向上します。例えば、階乗やフィボナッチ数列などを計算する場合にconstexprを使用できます。
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;
}
- C++11以前、配列の大きさは定数式でなければなりませんでした。constexprを使うと、コンパイル時に配列の大きさが計算されます。
constexpr int size = 10;
int array[size];
- C++11以降、constexprをテンプレートパラメータとして使用することで、より汎用的なテンプレートを作成することができます。例えば、constexprをテンプレートパラメータとして使用して、配列のサイズを指定することができます。
template <int Size>
struct Array {
int data[Size];
};
int main() {
Array<10> arr;
return 0;
}
- 定数の宣言:enum型の中でconstexprを使用することで、定数を宣言することができます。これにより、コンパイル時に検証され、より良い型の安全性が提供されます。
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;
}
- 定数関数用途:constexpr修飾子を使用することで、関数がコンパイル時に評価され、定数式のみが引数として受け入れられることを保証できます。
constexpr int square(int n) {
return n * n;
}
constexpr int result = square(5);
これらは単なるconstexprの一例であり、性能を向上させたりコードの可読性や保守性を高めるために多くの他のケースで使用することができます。