型の変換
remove_const、decayなどを使用します
「型の変換」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
型変換
問い合わせだけでなく、<type_traits>では元の型から新しい型を生成することもできます。これらの型特性はメンバー型::typeを公開し、C++14以降では_tショートカットを使用できます。
remove_const
std::remove_const_t<const int>はintになります。型の変更可能なバージョンが必要な場合に便利です。
#include <iostream>
#include <type_traits>
int main() {
using T = std::remove_const_t<const int>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}remove_reference
std::remove_reference_t<int&>はintになります。これは完全転送や汎用コードの記述に欠かせません。
#include <iostream>
#include <type_traits>
int main() {
using T = std::remove_reference_t<int&>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}add_pointerとadd_const
型変換では修飾子を追加することもできます。
add_const_t<int>=const intadd_pointer_t<int>=int*
#include <iostream>
#include <type_traits>
int main() {
using P = std::add_pointer_t<int>;
std::cout << std::is_same_v<P, int*> << "\n";
return 0;
}std::decay
std::decay_t<T>は、値渡しの際に行われる変換を再現します。参照とcv修飾子を取り除き、配列や関数をポインターに変換します。
#include <iostream>
#include <type_traits>
int main() {
using T = std::decay_t<const int&>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}配列の減衰
decayは、配列を関数に渡す場合とまったく同じように、配列型をポインターに変換します。
#include <iostream>
#include <type_traits>
int main() {
using T = std::decay_t<int[5]>;
std::cout << std::is_same_v<T, int*> << "\n";
return 0;
}remove_cv
std::remove_cv_t<const volatile int>はconstとvolatileの両方を取り除き、通常のintにします。
#include <iostream>
#include <type_traits>
int main() {
using T = std::remove_cv_t<const volatile int>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}common_type
std::common_type_t<A,B>は、両方の型から変換できる型を返します。これはa + bの結果の型に似ています。
#include <iostream>
#include <type_traits>
int main() {
using T = std::common_type_t<int, double>;
std::cout << std::is_same_v<T, double> << "\n";
return 0;
}underlying_type
列挙型では、std::underlying_type_t<E>によって、その列挙型の基盤となる整数型を確認できます。
#include <iostream>
#include <type_traits>
enum class Color : unsigned char { Red, Green };
int main() {
using U = std::underlying_type_t<Color>;
std::cout << std::is_same_v<U, unsigned char> << "\n";
return 0;
}型変換を連鎖させる
型変換は組み合わせて使用できます。転送された型を正規化するには、たとえばremove_cv_t<remove_reference_t<T>>のように組み合わせることがよくあります。これは基本的にdecayが最初に行う処理です。
型変換が重要な理由
汎用関数はconst T&やT&&を受け取ることが多い一方で、ローカル変数や戻り値を宣言するには素の型が必要になることがあります。型変換の型特性を使えば、そのような型を簡潔に取得できます。
確認問題
decayの動作を思い出してください。
まとめ
型変換について学びました。
- 型特性は
_tショートカットとともに::typeを公開する remove_const、remove_reference、remove_cvadd_pointer、add_const、decay- 導出結果を得るための
common_type、underlying_type
よくある質問
「型の変換」レッスンは無料ですか?
はい。「型の変換」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「型の変換」で何を学びますか?
remove_const、decayなどを使用します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「型の変換」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。