0Pricing
C++ Academy · レッスン

条件分岐

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フィードバックを取得できます。ローカル設定は不要です。

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

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