C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のstd::is_voidテンプレートとは?構文と使い方を実例付きで解説

本記事では、C++ STLに含まれる std::is_void テンプレートの仕組み、構文、具体的な使用例について詳しく解説します。

is_void は、<type_traits> ヘッダーファイルで定義されているテンプレートです。このテンプレートを使うことで、指定した型 T が void 型であるかどうかをコンパイル時に判定できます。

C++におけるvoid型とは?

簡単に言えば、void は「空」や「無」を意味します。関数を void 型として宣言した場合、その関数は何も値を返さないものとみなされます。

また、void ポインタを宣言することも可能です。void ポインタは、指し示す先の型が未指定のポインタですが、参照解除(デリファレンス)を行う前に、必ず他の型へのポインタとしてキャストする必要があります。void ポインタは型に関係なくあらゆるオブジェクトを指せるため、プログラマにとって非常に便利な機能となっています。

構文

template <class T> is_void;

パラメータ

このテンプレートが受け取るパラメータは型 T のみで、T が void 型であるかどうかを判定します。

戻り値

ブール値(bool)を返します。指定された型が void 型であれば true を、そうでなければ false を返します。

使用例

入力: is_void<void>::value;
出力: true

入力: is_void<int>::value;
出力: false

サンプルコード①:基本的な型での判定

#include <iostream>
#include <type_traits>
using namespace std;

int main() {
    cout << boolalpha;
    cout << "checking for is_void:";
    cout << "\nvoid:" << is_void<void>::value;
    cout << "\nconst void:" << is_void<const void>::value;
    cout << "\nint:" << is_void<int>::value;
    cout << "\nchar:" << is_void<char>::value;
    return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

checking for is_void:
Void: true
Const void: true
Int: false
Char: false

この結果から、void だけでなく const void も void 型として判定されることがわかります。一方、intchar といった通常の型は false となります。

サンプルコード②:volatile修飾子との組み合わせ

#include <iostream>
#include <type_traits>
using namespace std;

int main() {
    cout << boolalpha;
    cout << "checking for is_void:";
    cout << "\nDouble:" << is_void<double>::value;
    cout << "\nFloat:" << is_void<float>::value;
    cout << "\nvolatile void:" << is_void<volatile void>::value;
    cout << "\nconst volatile void:" << is_void<const volatile void>::value;
    return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

checking for is_void:
Double: false
Float: false
Volatile void: true
Const volatile void: true

doublefloat は false になりますが、volatile voidconst volatile void のように cv 修飾子(const / volatile)が付いた void 型も true と判定されます。is_void は最上位の cv 修飾子を無視して判定するためです。

補足:C++17以降では is_void_v が使える

C++17 以降では、変数テンプレート std::is_void_v<T> を使うことで、::value を省略してより簡潔に記述できます。

static_assert(std::is_void_v<void>, "void is void");
static_assert(!std::is_void_v<int>, "int is not void");

コンパイル時の型チェックや SFINAE、コンセプトの実装などにおいて、is_void は型特性(type traits)を活用した安全なコードを書くための基本ツールの一つです。

  1. C++のvoid関数でreturnする方法|値以外を返すテクニックを解説

    void関数が「void(空)」と呼ばれるのは、何も返さないためです。しかし、「void関数は何も返せない」という説明は、必ずしも正しいとは言えません。void関数から値を返すことはできませんが、値以外のものを返したり、return文を活用したりすることは可能です。本記事では、その具体的な方法をサンプルコードとともに解説します。void関数でもreturn文は使えるvoid関数は値を返すことができませんが、return文そのものを記述することは可能です。引数なしのreturn文は「この時点で関数を終了する」という意図を明示的に示す働きがあり、処理の流れが分かりやすくなるため、コードの可読性向上

  2. 【C++入門】デフォルトコンストラクタの基礎と使い方をわかりやすく解説

    C++のコンストラクタとは コンストラクタ(constructor)とは、クラスの新しいオブジェクト(インスタンス)を生成した瞬間に自動的に実行される特殊なメンバ関数です。オブジェクトの初期化処理を記述するための仕組みで、C++プログラミングにおいて非常に重要な役割を担っています。 コンストラクタの基本ルール クラス名と完全に同じ名前を持つ 戻り値の型を持たない(voidすら指定できない) オブジェクト生成時に自動的に呼び出される 特に引数を取らないコンストラクタは「デフォルトコンストラクタ」と呼ばれる メンバ変数に初期値を設定したい場合など、コンストラクタはとても便利です。以下のサンプル