c++ - Qual é o sentido de saber se um objeto é parte integrante ou não ou é um tipo de classe ou não?




templates (2)

Olá, já vi muitos exemplos como este no Cppreference.com:

std::is_class<T>
std::is_integral

E assim por diante. Sei que, se executar o código, por exemplo, sou true ou false . Mas qual é o sentido disso? por exemplo, sabendo que o objeto é do tipo classe ou não?

#include <iostream>
#include <type_traits>

struct A {};
class B {};
enum class C {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<A>::value << '\n';
    std::cout << std::is_class<B>::value << '\n';
    std::cout << std::is_class<C>::value << '\n';
    std::cout << std::is_class<int>::value << '\n';
}

A saída:

true
true
false
false
  • Eu procurei por todo o lado um exemplo real usando isso ( is_class , is_integral , is_arithmetic , ...) Mas todos os tutoriais mostram apenas o exemplo sem esperança: true ou false .

  • Alguém poderia me ajudar com um pequeno exemplo útil usando esses modelos?


É para meta-programação de modelos. Quando você não tem idéia de que tipo (s) o usuário final passará para o modelo. Às vezes é para relatar erros, às vezes é para se especializar nos tipos passados. Às vezes é uma combinação.

Os exemplos vistos em cppreference.com (por exemplo, https://en.cppreference.com/w/cpp/types/is_enum ) são muito simplificados e mostram apenas como usar a característica de maneira não típica. Você quase nunca usaria essas características diretamente em uma simples (função ou classe não modelo).


Não é para escrever no console, isso é certo.

De maneira mais ampla, você está perguntando: qual é o objetivo das características do tipo?

A resposta é a metaprogramação de modelos . Por exemplo, eu posso criar uma especialização de modelo que faz uma coisa para tipos integrais e outra para tipos não integrais.

Aaron Bullman tem uma introdução simples para digitar traços , assim como Jacek here .

Na minha opinião, a maior parte dessas coisas será encontrada enterrada em implementações de recursos interessantes, classes e utilitários (por exemplo, em bibliotecas) como parte do mecanismo de segundo plano que faz com que tudo funcione.

Leitura adicional:

  • Traços do tipo C ++
  • Como as classes de características funcionam e o que elas fazem?

A resposta da rightfold sobre a primeira fornece um excelente exemplo de quando as características são úteis:

Por exemplo, uma implementação de std::copy pode usar std::memcpy internamente em vez de um loop explícito quando os iteradores são ponteiros para PODs. Isso pode ser alcançado com o SFINAE.





templates