std::is_same în C++

Verifică la compilare dacă două tipuri sunt exact același tip.

Sintaxă
#include <type_traits>
std::is_same<T, U>::value
std::is_same_v<T, U>   // C++17

Ce face std::is_same

std::is_same_v<T, U> este true doar dacă T și U sunt identice, inclusiv const și referințe: int și const int sunt tipuri diferite. Rezultatul se calculează la compilare, deci se poate folosi în static_assert și if constexpr.

Este folosit în șabloane pentru a trata special un anumit tip și pentru a verifica ce tip deduce auto sau decltype. Varianta cu concept, din C++20, este std::same_as.

Parametri

Parametru Descriere
T, U Tipurile comparate.

Ce returnează

O constantă bool la compilare.

Exemple

Exemplul 1: Ce tipuri sunt identice

#include <cstdint>
#include <print>
#include <string>
#include <type_traits>

int main() {
    std::println("int și int: {}", std::is_same_v<int, int>);
    std::println("int și const int: {}", std::is_same_v<int, const int>);
    std::println("int și long: {}", std::is_same_v<int, long>);
    std::println("int32_t și int: {}", std::is_same_v<std::int32_t, int>);

    auto x = 2.5f;
    std::println("auto x = 2.5f este float: {}", std::is_same_v<decltype(x), float>);
    static_assert(std::is_same_v<std::string::size_type, std::size_t>);
}

Rezultat

int și int: true
int și const int: false
int și long: false
int32_t și int: true
auto x = 2.5f este float: true

Exemplul 2: Tratare specială într-un șablon

#include <print>
#include <string>
#include <type_traits>

template <class T>
void descrie(const T& valoare) {
    if constexpr (std::is_same_v<T, std::string>) {
        std::println("text de {} caractere: {}", valoare.size(), valoare);
    } else if constexpr (std::is_same_v<T, bool>) {
        std::println("da/nu: {}", valoare ? "da" : "nu");
    } else {
        std::println("altă valoare: {}", valoare);
    }
}

int main() {
    descrie(std::string("Cluj"));
    descrie(true);
    descrie(3.5);
}

Rezultat

text de 4 caractere: Cluj
da/nu: da
altă valoare: 3.5

Greșeli frecvente

  • Compari un tip dedus din parametru cu std::is_same_v<T, int>, dar T este int& sau const int. Rezultatul este false; elimină întâi calificativele cu std::remove_cvref_t sau std::decay_t.

Comenzi înrudite

  • std::same_as: Concepte C++20: same_as cere exact același tip, convertible_to cere un tip care se poate converti în altul.
  • decltype: Dă tipul exact al unei expresii, fără să o evalueze; util pentru a declara variabile „de același tip ca”.
  • 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.
  • static_assert: Verifică o condiție la compilare; dacă este falsă, compilarea se oprește cu mesajul dat.
  • std::remove_reference: remove_reference scoate referința dintr-un tip; decay îl transformă ca la transmiterea prin valoare.