条件分岐
std::conditionalとif constexprを使用します
「条件分岐」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
型と分岐を選択する
型特性のロジックを使うと、コンパイル時に型とコードパスを選択できます。中心となるツールはstd::conditionalとif constexprです。
std::conditional
std::conditional_t<cond, A, B>は、condがtrueの場合はAに、それ以外の場合はBになります。
#include <iostream>
#include <type_traits>
int main() {
using T = std::conditional_t<true, int, double>;
std::cout << std::is_same_v<T, int> << "\n";
return 0;
}格納型を選択する
よくある用途は、大きな値には大きな型を、それ以外には小さな型を選択することです。
#include <iostream>
#include <type_traits>
template <bool Big>
struct Storage {
using type = std::conditional_t<Big, long long, short>;
};
int main() {
Storage<true>::type a = 10;
std::cout << sizeof(a) << "\n";
return 0;
}if constexprの基礎
if constexpr(C++17)は、コンパイル時に選択されなかった分岐を破棄します。指定された型に対しては、選択された分岐だけがコンパイルできれば構いません。
#include <iostream>
#include <type_traits>
template <typename T>
void describe(T v) {
if constexpr (std::is_integral_v<T>)
std::cout << "integer: " << v << "\n";
else
std::cout << "other: " << v << "\n";
}
int main() {
describe(5);
describe(2.5);
return 0;
}if constexprが実行時のifより優れている理由
通常のifでは、すべてのTに対して両方の分岐をコンパイルできなければなりません。if constexprでは、選択されなかった分岐はインスタンス化されないため、通常なら無効になる型固有のコードを含めることができます。
型固有の操作
通常のifでは、intに対して.length()をコンパイルできないため、これは不可能です。
#include <iostream>
#include <string>
#include <type_traits>
template <typename T>
auto size_of(const T& v) {
if constexpr (std::is_same_v<T, std::string>)
return v.length();
else
return sizeof(v);
}
int main() {
std::cout << size_of(std::string("hi")) << "\n";
std::cout << size_of(42) << "\n";
return 0;
}オーバーロードにおけるenable_if
if constexprが登場する前は、std::enable_ifがSFINAEによってオーバーロードを選択していました。条件が偽の場合、その関数をオーバーロード解決の対象から除外します。
#include <iostream>
#include <type_traits>
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }
int main() {
only_int(7);
return 0;
}条件の組み合わせ
通常のブール値と同じように、コンパイル時の条件で&&、||、!を使ってトレイトを組み合わせることができます。
#include <iostream>
#include <type_traits>
template <typename T>
void check() {
if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
std::cout << "non-bool integer\n";
else
std::cout << "something else\n";
}
int main() {
check<int>();
check<bool>();
return 0;
}再帰的なコンパイル時選択
if constexprを使うと、コンパイル時の再帰が可能になります。これは、タプルやパラメーターパックを要素ごとに処理する場合に便利です。
conjunctionとdisjunction
C++17では、トレイトのリストに対して短絡評価を行う論理AND/ORのために、std::conjunctionとstd::disjunctionも提供されています。
適切なツールの選択
型を選択するにはconditional、コードを選択するにはif constexpr、オーバーロード解決を制御するにはenable_ifまたはコンセプトを使います。現代的なコードでは、明瞭さのためにif constexprとコンセプトがよく使われます。
確認問題
if constexprの主な利点を思い出してください。
まとめ
コンパイル時の条件分岐を学びました。
conditional_t<c,A,B>は型を選択しますif constexprはコードを選択し、もう一方の分岐を破棄しますenable_ifはSFINAEによってオーバーロード解決を制御します- 論理演算子でトレイトを組み合わせます
よくある質問
「条件分岐」レッスンは無料ですか?
はい。「条件分岐」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「条件分岐」で何を学びますか?
std::conditionalとif constexprを使用します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「条件分岐」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。