Olá, já vi muitos exemplos como este no Cppreference.com:
std::is_class<T>
std::is_integral
E assim por diante. Eu sei se eu executo o código, por exemplo, recebo true
or 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 todo para um exemplo real usando essa (
is_class
,is_integral
,is_arithmetic
, ...) Mas todos os tutoriais mostrar apenas o exemplo desesperada: únicatrue
oufalse
.Alguém poderia me ajudar com um pequeno exemplo útil usando esses modelos?
std::copy
. E se os tiposstd::copy
são "simples", como uma matriz deint
ouchar
? Você usariamemcpy
, certo? Então, como você diz "Se o tipo é simples, use memcpy, caso contrário, use um loop" lento ""?Respostas:
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 aqui .
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:
A resposta da rightfold sobre a primeira fornece um excelente exemplo de quando as características são úteis:
fonte
Power<T>
ou classe modelada quando o tipo de argumento não é integral, digamos std :: string?É 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 no 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).
fonte