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
conditionalsă aleagă la rulare. Condiția trebuie să fie o constantă de compilare; pentru valori cunoscute doar la rulare foloseșteifsaustd::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.