Apa gunanya mengetahui apakah suatu objek adalah integral atau bukan atau merupakan tipe kelas atau tidak?

14

Halo Saya telah melihat banyak contoh seperti ini di Cppreference.com:

std::is_class<T>
std::is_integral

Dan seterusnya. Saya tahu jika saya menjalankan kode misalnya saya dapatkan trueatau false. Tapi apa gunanya itu? misal mengetahui objek bertipe kelas atau tidak?

#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';
}

Hasil:

true
true
false
false
  • Saya sudah mencari di seluruh untuk contoh nyata menggunakan ini ( is_class, is_integral, is_arithmetic, ...) Tapi semua tutorial hanya menampilkan contoh harapan: hanya trueatau false.

  • Adakah yang bisa membantu saya dengan contoh kecil yang bermanfaat menggunakan templat ini?

Rami Yen
sumber
1
Contoh sederhana - std::copy. Bagaimana jika jenisnya std::copy"sederhana", seperti array intatau char? Anda akan menggunakan memcpy, kan? Jadi, bagaimana Anda mengatakan "Jika tipenya sederhana, gunakan memcpy, kalau tidak gunakan loop" lambat "?
PaulMcKenzie

Jawaban:

17

Itu bukan untuk menulis ke konsol, itu sudah pasti.

Lebih luas Anda bertanya: apa gunanya ciri tipe?

Jawabannya adalah metaprogramming template . Sebagai contoh, saya dapat membuat spesialisasi templat yang melakukan satu hal untuk tipe integral, dan lainnya untuk tipe non-integral.

Aaron Bullman memiliki pengantar sederhana untuk mengetik ciri-ciri , seperti halnya Jacek di sini .

Menurut pendapat saya, sebagian besar penggunaan hal-hal ini akan ditemukan terkubur dalam implementasi fitur-fitur keren dan kelas-kelas dan utilitas (yaitu di perpustakaan) sebagai bagian dari mesin latar belakang yang membuat semuanya berfungsi.

Bacaan lebih lanjut:

Jawaban rightfold pada yang pertama memberikan contoh yang bagus kapan sifat berguna:

Sebagai contoh, implementasi dari std::copydapat menggunakan secara std::memcpyinternal alih-alih loop eksplisit ketika iterator adalah pointer ke PODs. Ini dapat dicapai dengan SFINAE.

Lightness Races di Orbit
sumber
Jadi maksud Anda misalnya saya dapat menggunakannya untuk menonaktifkan beberapa contoh template untuk tipe tertentu misalnya logis untuk menonaktifkan fungsi Power<T>atau kelas templated ketika tipe argumen tidak terpisahkan katakanlah std :: string?
Rami Yen
1
@RamiYen, Ya, itu disebut sebagai SFINAE .
chris
7

Ini untuk pemrograman meta template. Ketika Anda tidak tahu jenis apa, pengguna akhir akan masuk ke template. Terkadang untuk melaporkan kesalahan, terkadang untuk mengkhususkan pada jenis yang diteruskan. Terkadang kombinasi.

Contoh-contoh yang terlihat di cppreference.com (mis. Https://en.cppreference.com/w/cpp/types/is_enum ) sangat disederhanakan dan hanya menunjukkan cara menggunakan sifat dengan cara yang tidak tipikal. Anda hampir tidak akan pernah menggunakan sifat-sifat ini secara langsung dalam fungsi sederhana (fungsi atau kelas non-templat).

Richard Critten
sumber