8 Kasım 2019 Cuma

std::type_info Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <typeinfo>
typeid bir nebzeye kadar Reflection gibidir. Bir sınıfın veya nesnenin ismini alabilmemizi sağlar.

Bu sınıfın çıktısı pek okunaklı değil. Onun yerine boost typeindex kütüphanesini kullanmak çok daha iyi. Şöyle yaparız.
#include <boost/type_index.hpp>

cout << boost::typeindex::type_id_with_cvr<decltype(v)::value_type>().pretty_name();
1. Metodlar

constructor
Private olduğu için erişemeyiz. Bu sınıfı yaratmanın tek yolu typeid(...) metodunu kullanmak. Şöyle yaparız.
typeid(T)
hash_code metodu
İmzası şöyle
size_t hash_code() const noexcept;
Açıklaması şöyle
7 Returns: An unspecified value, except that within a single execution of the program, it shall return the same value for any two type_info objects which compare equal.
8 Remark: an implementation should return different values for two type_info objects which do not compare equal.
name metodu
İmzası şöyle
const char* name() const;
Açıklaması şöyle.
Returns an implementation defined null-terminated character string containing the name of the type. No guarantees are given, in particular, the returned string can be identical for several types and change between invocations of the same program.
Sınıf ismi okunabilir olmayabilir. Derleyicisine göre değişir. Visual Studio derleyicisi okunaklı isimler üretirken, gcc üretmeyebilir. Şöyle yaparız.
typeid(T).name();
operator == metodu
Örnek
Şöyle yaparız.
template <typename T>
void test_template(const T &t)
{
  if (typeid(t) == typeid(double))
    cout <<"double\n";
  if (typeid(t) == typeid(string))
    cout <<"string\n";
  if (typeid(t) == typeid(int))
    cout <<"int\n";
}

int main()
{
  auto a = -1;
  string str = "ok";
  test_template(a); // Prints int
  test_template("Helloworld"); // Does not print string
  test_template(str); // Prints string
  test_template(10.00); // Prints double

  return 0;
}
operator == metodu - array
Eğer tip array ise uzunluğu önemlidir.
char name[9];
if (typeid(name) == typeid(char []) {...}// False
Şöyle yaparız.
char name[9];
if (typeid(name) == typeid(char [9]) {...}// True
operator != metodu
Bu metod C++20 ile kaldırılıyor.

2. Çeşitli Örnekler

Örnek - const tip
Açıklaması şöyle. İsimde const kelimesi olmaz anlamına gelir.
If the type of the expression or type-id is a cv-qualified type, the result of the typeid expression refers to a std::type_info object representing the cv-unqualified type.
Şöyle yaparız.
constexpr auto pair_of_ints = std::make_pair(1, 2);
    std::cerr << typeid(pair_of_ints).name();
Çıktı olarak şunu alırız. Dikkat edilirse isimde const kelimesi geçmez.
std::__1::pair<int, int>
Örnek - class
Şöyle yaparız.
class X
{
  int a;
};

int main()
{

  X myVariable;
  cout << typeid(myVariable).name() << endl;
}
Visual Studio şu çıktıyı ver.r
"class X"
Örnek - vector::value_type
Elimizde şöyle bir kod olsun.
vector<string> v = {"apple", "facebook", "microsoft", "google" };
Şöyle yaparız.
cout << typeid(decltype(v)::value_type).name() << endl;
Çıktı olarak şuna benzer bir şey alırız.
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
Örnek - lambda
Tamamen okunaksız bir şey verir.
#include <iostream>
#include <typeinfo>
using namespace std;
int main() { cout << typeid([]{}).name() << endl; }
g++  şu çıktıyı verir.
Z4mainEUlvE_
Visual Studio şu çıktıyı verir.
class <lambda_2d4f....>

Hiç yorum yok:

Yorum Gönder