Thread overview
Türleri Sorgulamak
Mar 03, 2013
Salih Dinçer
Mar 03, 2013
Salih Dinçer
Mar 03, 2013
Salih Dinçer
March 03, 2013

Merhaba,

TypeInfo yapısını ve is işleçini kullanarak türleri algılamak veya sorgulamak istiyorum. Bu işleçe maalesef yabancıyım ama araştırdığım kadarıyla bir kaç şekilde kullanmak mümkün görünüyor. Acaba aşağıdaki örnekte typeid() kullanmadan, tekrar bir TypeInfo verisi oluşturmadan bunu kullanabilmenin bir yöntemi var mı?

import std.stdio;
import std.typetuple;

void main()
{
   enum index = 1;
   alias TypeTuple!(bool, byte, short) türler;

   TypeInfo tür = typeid(türler[index]);
            tür.writeln;

   if(tür.tsize() > 1)
   {
       writeln("bool olamaz ama\n"
               "uint veya short\n"
               "olabilir...");
   } else writeln("bool mu acaba, belki de byte'dır!");

   if(tür is typeid(bool)) "(1) bu bir bool".writeln;
   if(is(tür == bool)) "(2) bu bir bool".writeln; // çalışmıyor!
   if(is(tür: bool)) "(3) bu bir bool".writeln; // çalışmıyor!
}

Burada maksat bool türlerini birbirleriyle karışabilecek ve aynı uzunlukta olan diğer türlerden ayırt etmek. Toplam 3 ifade denedim ama sadece 1.'si çalışıyor!

Teşekkürler...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 03, 2013

Öncelikle TypeTuple'ı kolaylık olması için kullanmıştım. Eğer index = 0 olursa ilk satırın çalıştığı görülüyor. Static öğelerin kullanmaktan elimden geldiğince kaçınıyorum. İşimi artık 'typeid()' ile halletmeye çalışacağım.

Gerçi bir sorun daha çıktı ama konu başlığı ile ilgili değil. Belki TypeInfo daha kullanışlı hale getirilebilir.

Yanıt için teşekkür ederim...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 04, 2013

Veri türünü dizgeye çevirmek hiç aklıma gelmemişti. Aslında .stringof'u denemiştim ama bana değişkenin türünü değil kod içinde yazdığım adını verince işime yaramadı. Bazı şeyleri yanlış kullanıyor olabilirim ama derleyici hata vermeyince çalışmaması beni bazen caresiz bırakıyor!

Neyse ki sizler varsınız...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 03, 2013

Bunlar şablon özellemelerinde ve 'static if' gibi koşullu derleme durumlarında yararlı. TypeTuple'u ise ben yalnızca birim testlerinde kullandım: "şu türlerin hepsi için şu kodları işlet" derken kullanışlı.

Gösterdiğin örnekteki son üç satırın hiçbirisi bende bir şey yazdırmıyor. O yüzden neden son ikisine "çalışmıyor" dediğini anlayamadım.

Şunu varsayıyorum: Sana bazı türler gelecek ve sen bunların içinden yalnızca birisiyle bir şey yapacaksın:

import std.stdio;
import std.typetuple;

void foo(T)()
{
   writefln("%s türü ile bir şey yapıyorum", T.stringof);

   static if (is (T == bool)) {
       writefln("  %s için özel bir şey daha yapıyorum", T.stringof);
   }
}

void main()
{
   alias TypeTuple!(bool, byte, short) türler;

   foreach (tür; türler) {
       foo!tür();
   }
}

is ifadesi bazen çok karışık olabiliyor. Ben anladıklarımı şurada "is ifadesi" başlığında yazmıştım:

http://ddili.org/ders/d/kosullu_derleme.html

'==' kullanınca tam o türden olmak anlamına geliyor. ':' kullanınca ise otomatik olarak o türe dönüşebilmek anlamına geliyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 03, 2013

Alıntı (Salih Dinçer):

>

Eğer index = 0 olursa ilk satırın çalıştığı görülüyor.

Şimdi anladım. :) typeid() o tür hakkında bilgi içeren bir TypeInfo nesnesi döndürüyormuş:

http://dlang.org/expression.html#TypeidExpression
http://dlang.org/phobos/object.html#.TypeInfo

Birinci kullanımda '(tür is typeid(bool))' dediğin zaman elinde iki tane sınıf değişkeni var. Ek olarak, buradaki 'is', is işleci... (Yani is ifadesi değil.) Dolayısıyla bu iki sınıf değişkeninin aynı nesneyi gösterip göstermediklerini sorgulamış oluyoruz. Bu sonuçtan anlaşıldığına göre, typeid()'nin döndürdüğü nesnelerden her tür için bir adet oluşturuluyor ve typeid() o nesneyi döndürüyor.

İkinci ve üçünce kullanımda ise is ifadesi var. İşin garibi, o kullanımların ikisi de şuradaki listedeki kullanımlara uymuyor:

http://dlang.org/expression.html#IsExpression

Çünkü 'tür' isimli değişken aslında bir tür değil de bir TypeInfo değişkeni. Belki de bir dmd hatası olan o garipliği bir kenara bırakırsak dördüncü yöntem olarak şunu görüyorum:

   if(tür.toString == "bool") "(4) bu bir bool".writeln;

Tabii bool olduğu bilinmediğinde T.stringof de yazılabilir.
Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]