型の問い合わせ
コンパイル時に型を検査します
「型の問い合わせ」は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_pointeris_referenceis_arrayis_classis_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_constis_signedis_trivially_copyableis_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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 型の問い合わせ
- 型の変換
- 条件分岐
- カスタムtraitsの作成