C++のstd::is_trivial関数とは?使い方とサンプルコードを解説
本記事では、C++のSTLに含まれるstd::is_trivialテンプレートについて、その仕組み・構文・実際のコード例をわかりやすく解説します。
is_trivialは、<type_traits>ヘッダーファイルで定義されているテンプレートの一つで、指定した型Tが「トリビアル(自明)なクラス」であるかどうかを判定するために使用されます。
C++におけるトリビアル型(trivial type)とは?
トリビアル型とは、データが連続したメモリ領域に格納され、静的なデフォルト初期化のみを受け入れる型のことを指します。トリビアル型には、任意の型の配列、クラス、スカラー型などが含まれます。
トリビアルクラスとは、トリビアルにデフォルト構築可能であり、かつトリビアルにコピー可能であるクラスです。クラスをトリビアルにするためには、以下の条件を満たす必要があります。
- 仮想メンバ関数や仮想基底クラスを持っていないこと
- 非静的なメンバ変数の初期化処理などが存在しないこと
- 非静的メンバを持つ基底クラスを継承していないこと
構文
template <class T> is_trivial;
パラメータ
このテンプレートは、型Tをパラメータとして受け取り、その型がトリビアルなクラス型であるかどうかをチェックします。
戻り値
ブール値(bool)を返します。指定された型がトリビアルなクラス型であれば true を、そうでなければ false を返します。
使用例
入力:
class A {};
class B { B() {} };
class D { virtual void fn() {} };
cout<<"A: "<<is_trivial<A>;
cout<<"B: "<<is_trivial<B>;
cout<<"D: "<<is_trivial<D>;
出力:
A: True
B: False
D: Falseこの例では、クラスAは空のクラスなのでトリビアルと判定されます。一方、クラスBはユーザー定義のコンストラクタを持ち、クラスDは仮想関数を持つため、いずれもトリビアルではないと判定されます。
実際のコード例
#include <iostream>
#include <type_traits>
using namespace std;
class TP_1 {
};
class TP_2 {
TP_2(){
}
};
class TP_3 : TP_2 {
};
class TP_4 {
virtual void dummy() {
}
};
int main() {
std::cout << std::boolalpha; // 結果をtrue/falseで表示
std::cout << "TP_1: " << std::is_trivial<TP_1>::value << endl;
std::cout << "TP_2: " << std::is_trivial<TP_2>::value << endl;
std::cout << "TP_3: " << std::is_trivial<TP_3>::value << endl;
std::cout << "TP_4: " << std::is_trivial<TP_4>::value << endl;
return 0;
}実行結果
上記のコードを実行すると、以下のような出力が得られます。
TP_1: true TP_2: false TP_3: false TP_4: false
各クラスの判定結果のポイント
- TP_1: メンバやコンストラクタを持たない空のクラスのため、トリビアル(true)と判定されます。
- TP_2: ユーザー定義のコンストラクタを持つため、トリビアルではありません(false)。
- TP_3: トリビアルではないTP_2を継承しているため、トリビアルではありません(false)。
- TP_4: 仮想関数を持つため、トリビアルではありません(false)。
このようにstd::is_trivialを使うことで、型が単純なメモリコピーで扱えるかどうかをコンパイル時に判定でき、memcpyなどの最適化やテンプレートメタプログラミングにおいて非常に役立ちます。
-
C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説
swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s
-
C++のフレンド関数とフレンドクラスの基本を解説
C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。フレンドとして指定できるものフレンドとして宣言できるのは、以下のようなものです。通常の関数関数テンプレート他のクラスのメンバー関数クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります