Giriş
Şu satırı dahil ederiz.
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.
constructor
Private olduğu için erişemeyiz. Bu sınıfı yaratmanın tek yolu typeid(...) metodunu kullanmak. Şöyle yaparız.
İmzası şöyle
İmzası şöyle
Örnek
Şöyle yaparız.
Eğer tip array ise uzunluğu önemlidir.
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.
Şöyle yaparız.
Elimizde şöyle bir kod olsun.
Tamamen okunaksız bir şey verir.
Ş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. Metodlarconstructor
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ı şöylename metodu7 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.
İmzası şöyle
const char* name() const
;
Açıklaması şöyle.Sınıf ismi okunabilir olmayabilir. Derleyicisine göre değişir. Visual Studio derleyicisi okunaklı isimler üretirken, gcc üretmeyebilir. Şöyle yaparız.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.
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 - arrayEğ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 != metoduBu 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.
Şöyle yaparız.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.
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_typeElimizde şö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 - lambdaTamamen 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