THT DUYURU

C/C++ Çok paradigmalı ve çok kullanılan C/C++ dillerinin dökümanlarının paylaşım alanı.

Seçenekler

C++ İle Otomatik Veri Tipi Algılama

ilyn - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
01/2019
Nereden:
<iostream>
Mesajlar:
135
Konular:
9
Teşekkür (Etti):
13
Teşekkür (Aldı):
38
Ticaret:
(0) %
11-01-2020 00:56
#1
C++ İle Otomatik Veri Tipi Algılama
Bundan bir şey çıkarabilmek için ortalama C++ bilginizin olması lazım!!! En azından biraz template, typename & castlar(reinterpret).
İleri düzey programcılar için veri tiplerini tek tek işlemek (fun->setInt, setString vb...) bi hayli zordur ve görünüş bakımından kötü gözükürler. Aslında bunun kolay bir yolu var. Direkt adımları anlatıcam. Not: Bu kod sadece VS16 ve intellisense'nin Ocak 1, 2020 versiyonu ile test edildi. Kod biraz değişik olduğundan olur olmadık yerde intellisense hata doğurabilir. Neyse, ilk olarak intellisense'nin kudurmaması için bazı şeyleri tanımlayalım:
Kod:
//Bu alanı istediğiniz yere yapıştırın yeter ki hata vermesin :)
typedef unsigned __int32  uint32; //uint32 bit, çok işe yarar
typedef const char* cStr; //direkt string, "Selam, nasılsın?" gibi. "Selam, " + std::to_string(14) + " nasılsın?" İÇİN DEĞİL!!!
typedef std::basic_string<char, struct std::char_traits<char>, class std::allocator<char> > eStr; 
//İşte bu "Selam, " + std::to_string(14) + " nasılsın?" için. Açıklamama gerek yok bunu bilenler bilir :)
Şimdi sınıflara girelim:

Kod:
class SuperVeriAlgilayici3000 { //Bu sınıf çok gereksiz biliyorum ama kim bilir ileride iş görür?
private:
        template<typename T>
        vo id veriyiTanimla(T t) {
              if (typeid(t) == typeid(__int32))
              {
                    int sonuc = reinterpret_cast<__int32>(t); //reinterpret kullanmak zorundayım :( intellisense sağ olsun
                    printf("INT32 Degerindeki sonuc: %d\n", sonuc);
	      }
              //else-if kullanarak digerlerini de ekleyebirirsiniz
              else {
                   printf("Bu nasil bir veri tipidir arkadas? Tanimlamayi mi unuttun?\n");
              }
        }
public:
	template <typename... siradaki>
	**** algila(siradaki... degerler) {
		int cokGerekliBirsey[] = { 0, ((vo id)veriyiTanimla(forward<siradaki>(degerler)), 0) ... }; //evet, isimden de belli olduğu üzere...
        }
}
Peki nasıl kullanırım?

Kod:
SuperVeriAlgilayici3000* oha = new SuperVeriAlgilayici3000(); //class olduğu için bunu yapmak zorundayım. 
                                                                                                               //En azından bunu yazarken class halinde işimi görüyordu.
oha->algila(6645, 6544877, 1, 0, -54487); //Buraya istediğiniz kadar veri girebilirsiniz, tabii tanımlı ise. Örn: algila(5454, "Selam", *(__int64*)(data + 12)...);


Bunu yazdıktan sonra bir kendime, bir de koda bakıyordum. İşimi o kadar çok kolaylaştırdı ki...

Uzun bir aradan sonra ilk konum. Biraz düz geçmiş olabilirim. Af ola


Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler