0Pricing
C++ Academy · レッスン

型の問い合わせ

コンパイル時に型を検査します

「型の問い合わせ」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

型特性とは

<type_traits>ヘッダーを使うと、コンパイル時に型について調べられます。各型特性は、定数::valueまたはメンバー型を公開するテンプレートです。

is_integral

std::is_integral<T>::valueは、intやcharなどの整数型に対してtrueになり、それ以外ではfalseになります。

#include <iostream>
#include <type_traits>

int main() {
    std::cout << std::is_integral<int>::value << "\n";
    std::cout << std::is_integral<double>::value << "\n";
    return 0;
}

_vショートカット

C++17では_v変数テンプレートが追加され、::valueの代わりにstd::is_integral_v<T>と記述できるようになりました。

#include <iostream>
#include <type_traits>

int main() {
    std::cout << std::is_integral_v<long> << "\n";
    std::cout << std::is_floating_point_v<float> << "\n";
    return 0;
}

分類用の型特性

多くの型特性は、型を分類します。

  • is_pointer
  • is_reference
  • is_array
  • is_class
  • is_enum
#include <iostream>
#include <type_traits>

struct S {};

int main() {
    std::cout << std::is_pointer_v<int*> << "\n";
    std::cout << std::is_class_v<S> << "\n";
    std::cout << std::is_reference_v<int&> << "\n";
    return 0;
}

関係を調べる型特性

2つの型を比較する型特性もあります。

  • is_same<A,B>
  • is_base_of<Base,Derived>
  • is_convertible<From,To>
#include <iostream>
#include <type_traits>

struct Base {};
struct Derived : Base {};

int main() {
    std::cout << std::is_same_v<int, int> << "\n";
    std::cout << std::is_base_of_v<Base, Derived> << "\n";
    return 0;
}

プロパティを調べる型特性

プロパティを調べる型特性は、修飾子や機能の有無を示します。

  • is_const
  • is_signed
  • is_trivially_copyable
  • is_default_constructible
#include <iostream>
#include <type_traits>

int main() {
    std::cout << std::is_const_v<const int> << "\n";
    std::cout << std::is_signed_v<unsigned> << "\n";
    return 0;
}

static_assertで型特性を使う

型特性はstatic_assertと組み合わせることで、コンパイル時に要件を適用できます。

#include <type_traits>
#include <iostream>

template <typename T>
T add(T a, T b) {
    static_assert(std::is_arithmetic_v<T>, "T must be a number");
    return a + b;
}

int main() {
    std::cout << add(2, 3) << "\n";
    return 0;
}

型特性の仕組み

型特性は単なる構造体テンプレートです。汎用テンプレートはfalse_typeを継承し、一致する型向けの特殊化はtrue_typeを継承します。コンパイラーが最適な一致を選択します。

integral_constant

すべての真偽型特性はstd::integral_constantから派生します。true_typeとfalse_typeは、valueがそれぞれtrueまたはfalseになるようにした、その別名にすぎません。

#include <iostream>
#include <type_traits>

int main() {
    std::cout << std::true_type::value << "\n";
    std::cout << std::false_type::value << "\n";
    return 0;
}

テンプレート内で問い合わせる

型特性を使うと、テンプレートが受け取った型の種類に応じて分岐できます。これにより、int、float、ポインター、クラス型などに対して異なる動作をする汎用コードを記述できます。

コンパイル時のみ

型特性への問い合わせには実行時コストがありません。コンパイル中に評価され、結果は生成されたコードに組み込まれます。

確認問題

C++17で追加された便利な構文を思い出してください。

まとめ

型を問い合わせる方法を学びました。

  • <type_traits>はコンパイル時に型についての情報を返す
  • ::valueまたは_vショートカットがboolを返す
  • 分類、関係、プロパティを調べる型特性がある
  • static_assertと組み合わせて制約を適用する

よくある質問

「型の問い合わせ」レッスンは無料ですか?

はい。「型の問い合わせ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「型の問い合わせ」で何を学びますか?

コンパイル時に型を検査します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「型の問い合わせ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 型の問い合わせ
  2. 型の変換
  3. 条件分岐
  4. カスタムtraitsの作成
← C++ Academyに戻る