std::conditional în C++

Alege un tip din două, la compilare, după o condiție: un fel de operator ?: pentru tipuri.

Sintaxă
#include <type_traits>
template<bool Conditie, class T, class F>
struct conditional;
std::conditional_t<Conditie, T, F>   // C++14

Ce face std::conditional

std::conditional_t<conditie, A, B> este tipul A dacă condiția este adevărată și B altfel. Condiția trebuie să fie cunoscută la compilare.

Se folosește în șabloane, de exemplu pentru a alege un tip numeric suficient de mare sau o variantă const/non-const a unui tip.

Parametri

Parametru Descriere
Conditie Expresia bool evaluată la compilare.
T, F Tipul ales când condiția este adevărată, respectiv falsă.

Ce returnează

Unul dintre cele două tipuri.

Exemple

Exemplul 1: Un contor de mărime potrivită

#include <cstdint>
#include <limits>
#include <print>
#include <type_traits>

template <std::uint64_t Maxim>
using Contor = std::conditional_t<(Maxim <= std::numeric_limits<std::uint16_t>::max()),
                                  std::uint16_t, std::uint64_t>;

int main() {
    Contor<1000> mic = 999;
    Contor<10'000'000> mare = 9'999'999;
    std::println("Contor<1000>: {} octeți, valoare {}", sizeof(mic), mic);
    std::println("Contor<10000000>: {} octeți, valoare {}", sizeof(mare), mare);
}

Rezultat

Contor<1000>: 2 octeți, valoare 999
Contor<10000000>: 8 octeți, valoare 9999999

Greșeli frecvente

  • Te aștepți ca conditional să aleagă la rulare. Condiția trebuie să fie o constantă de compilare; pentru valori cunoscute doar la rulare folosește if sau std::variant.

Comenzi înrudite

  • std::enable_if: Activează o funcție-șablon doar pentru tipurile care îndeplinesc o condiție (tehnica SFINAE).
  • std::is_same: Verifică la compilare dacă două tipuri sunt exact același tip.
  • if constexpr: Un if evaluat la compilare: ramura falsă este eliminată complet, deci poate conține cod care nu s-ar compila pentru tipul curent.
  • template: Scrie o funcție sau o clasă o singură dată, pentru orice tip; compilatorul generează varianta potrivită pentru fiecare tip folosit.