C++のstatic_assertとは?使い方と実例をわかりやすく解説
static_assertは、プログラムのコンパイル時に条件を検証し、条件が満たされない場合にコンパイルエラーとしてメッセージを表示するC++の機能です。実行時ではなくコンパイル時に問題を検出できるため、テンプレートメタプログラミングなどで特に有用です。プログラムの実行結果を汚すことなく、開発者に明確なエラーメッセージを伝えられる点が大きな魅力です。
C++11およびC++14では、static_assertを定義する際に必ずエラーメッセージを記述する必要がありました。しかし、C++17からはメッセージを省略してstatic_assertを呼び出すことが可能になりました。
また、static_assertはBOOST_STATIC_ASSERTなど、他のアサート系ライブラリの関数とも互換性があります。
構文
static_assert( 定数式, "エラーメッセージ" ); // C++11 / C++14 static_assert( 定数式 ); // C++17以降(メッセージ省略可能)
第1引数には、コンパイル時に評価できる定数式を指定します。この式がfalseと評価された場合、コンパイルが中止され、指定したメッセージがエラー出力に表示されます。第2引数のメッセージは、C++17以降では省略できます。
使用例
次の例では、テンプレート関数内でstatic_assertを使用し、関数オブジェクトの戻り値の型が配列の要素型に変換可能であることをコンパイル時に検証しています。
#include <bits/stdc++.h>
using namespace std;
template <typename T, size_t N, typename F> // テンプレート宣言
void fillarray(array<T, N>& a, F&& f) { // 値を格納する関数
static_assert(is_convertible<typename result_of<F()>::type, T>::value,
"Incompatible type returned by fun()"); // 型の不整合を検出するstatic_assert
for (auto& x : a)
x = f();
}
int main() {
array<vector<string>, 20> a;
fillarray(a, []() { return vector<string>{"TutorialsPoint"}; });
return 0;
}このコードでは、is_convertibleを用いて、ラムダ式f()の戻り値の型が要素型Tに変換できるかどうかを判定しています。もし互換性のない型を返す関数を渡すと、static_assertが失敗し、コンパイルエラーが発生します。
出力例
互換性のない型を返す関数を渡した場合、コンパイラは次のようなエラーメッセージを出力します。
… … … prog.cpp:20:61: required from here prog.cpp:10:5: error: static assertion failed: Incompatible type returned by fun()
このように、static_assertを活用することで、実行時エラーになる前に型の不整合などの問題をコンパイル段階で検出でき、より安全で堅牢なコードを書くことができます。
-
C++で質素数(Frugal Number)を判定する方法【サンプルコード付き】
この記事では、正の整数 N が与えられたときに、その数が質素数(Frugal Number)であるかどうかを判定するプログラムを C++ で作成する方法を解説します。 質素数とは? 質素数(FRUGAL NUMBER)とは、その数自身の桁数が、素因数分解による表現の桁数よりも厳密に大きい数のことです。 例:625 の場合 625 を素因数分解すると 54 となります。 625 自身の桁数:3 桁 54 の表現の桁数:2 桁 3 は 2 よりも厳密に大きいため、625 は質素数です。 最初のいくつかの質素数:125、128、243、256、343、512、625 など 問題を理解するための具
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の