Bir nesnenin integral olup olmadığını veya sınıf tipi olup olmadığını bilmenin anlamı nedir?


14

Merhaba Cppreference.com'da böyle birçok örnek gördüm:

std::is_class<T>
std::is_integral

Ve bunun gibi. Örneğin ben olsun trueveya kodu çalıştırmak olmadığını biliyorum false. Fakat bunun anlamı nedir? örneğin, nesnenin sınıf tipinde olup olmadığını bilmek?

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

Çıktı:

true
true
false
false
  • Bunu kullanarak gerçek bir örneğin her yerinde arama yapmış ( is_class, is_integral, is_arithmetic, ...) Ama bütün öğreticiler sadece umutsuz bir örnek gösterir: Sadece trueveya false.

  • Herkes bu şablonları kullanarak küçük bir yararlı örnek bana yardımcı olabilir mi?


1
Basit bir örnek std::copy. Ya bir std::copy" intveya " dizisi gibi "basit" ise char? Kullanırdın memcpy, değil mi? Peki "Tür basitse, memcpy kullanın, başka bir" yavaş "döngü" nasıl dersiniz?
PaulMcKenzie

Yanıtlar:


17

Konsola yazmak için değil, kesin.

Daha genel olarak soruyorsunuz: tür özelliklerinin anlamı nedir?

Cevap şablon meta programlamasıdır . Örneğin, integral türler için bir şey, integral olmayan türler için başka bir şey yapan bir şablon uzmanlığı oluşturabilirim.

Aaron Bullman sahiptir özellikleri yazmak için basit bir tanıtım Jacek yaptığı gibi, burada .

Benim düşünceme göre, bu şeylerin çoğu kullanımı, arka plan makinesinin bir parçası olarak havalı özellikler ve sınıflar ve yardımcı programların (yani kütüphanelerde) uygulamalarında gömülü olarak bulunacaktır.

Daha fazla okuma:

rightfold'un bu ilk sorudaki cevabı, özelliklerin ne zaman yararlı olduğuna dair mükemmel bir örnek verir:

Örneğin , yineleyiciler POD'lara işaret ettiğinde , bir uygulaması açık bir döngü yerine dahili olarak std::copykullanabilir std::memcpy. Bu SFINAE ile gerçekleştirilebilir.


Yani, örneğin, belirli bir tür için şablonların bazı örneklerini devre dışı bırakmak için kullanabilirim, örneğin Power<T>, argüman tipi integral olmadığında geçici bir işlevi veya sınıfı devre dışı bırakmak mantıklıdır diyelim ki std :: string?
Rami Yen

1
@RamiYen, Evet, buna SFINAE denir .
chris

7

Şablon meta programlama içindir. Hangi tür (ler) in ne olduğu hakkında hiçbir fikriniz yoksa, son kullanıcı şablona geçecektir. Bazen hataları rapor etmek, bazen de geçen türler üzerinde uzmanlaşmaktır. Bazen bu bir kombinasyon.

Cppreference.com'da görülen örnekler (örn. Https://en.cppreference.com/w/cpp/types/is_enum ) çok fazla basitleştirilmiştir ve özelliğin tipik olmayan bir şekilde nasıl kullanılacağını gösterir. Bu özellikleri neredeyse hiçbir zaman doğrudan basit bir şablonda (şablon olmayan işlev veya sınıf) kullanmazsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.