2009-11-27 43 views

cevap

2

kontrol tipi gibi ek faydaları ile, C++ 0x Variadic Templates ile kaplı olabilir. Bir örnek vereyim. 1985 yılında differential execution tekniği üzerine tökezledim ve kullanıcı arayüzlerini programlamak için gerçekten iyi bir araç olduğunu düşünüyorum. bir ayrıştırıcı yazmaya olurdu bunu yapmak için, Şimdi

void deFoo(..args..){ 
    if (mode & 1){x = y;} 
    {int svmode = mode; if (deIf(..some test..)){ 
    deBar(((mode & 1) arg1 : 0), ...) 
    } mode = svmode;} 
    {int svmode = mode; while(deIf(..another test..)){ 
    ... 
    } mode = svmode;} 
    ... 
} 

gerçekten iyi bir yol: Böyle kontrol yapısı ile

void Foo(..args..){ 
    x = y; 
    if (..some test..){ 
    Bar(arg1, ...) 
    } 
    while(..another test..){ 
    ... 
    } 
    ... 
} 

ve Tepe yapabilecek: Temelde, basit yapılı böyle programlar alır C veya taban dili ne olursa olsun, ve sonra ayrıştırmak ağacını yürü, istediğim kodu oluşturmak. (Lisp'de yaptığım zaman, bu bölüm kolaydı.)

Ancak C, C++ ya da her neyse bir çözümleyici yazmak isteyen var mı? Ben C# bunu yaparken

void deFoo(..args..){ 
    PROTECT(x = y); 
    IF(..some test..) 
    deBar(PROTECT(arg1), ...) 
    END 
    WHILE(..another test..) 
    ... 
    END 
    ... 
} 

Ancak, onların bilgelik birileri makro kötüydü karar verdi ve ben don: Böyle kod yazmak, böylece

Yani, bunun yerine, sadece makro yazma C# ayrıştırıcısı yazmak istemiyorum, bu yüzden kod nesnesini el ile yapmalıyım. Bu bir kraliyet acısıdır, ama yine de bu şeyleri kodlamanın olağan yoluna göre buna değer.

+0

+1 Teşekkürler Mike. Bu en iyi cevaptır :) – Viet

5

, makro genişleme hata ayıklamak için çok zor. Öte yandan, kod üreteci yazmak hata ayıklamaktan daha kolaydır çünkü kendi başına ayrı bir programdır. Bununla birlikte, bunun yalnızca C önişlemcisinin bir sınırlaması olduğunun farkında olmalısınız. Örneğin, Lisp dil ​​ailesinde, makro genişleme , kod neslidir, tam olarak aynı şeydir. Bir makro yazmak için, S-expression girişini başka bir S-ifadesine dönüştürmek için bir program yazarsınız (Lisp içinde), daha sonra derleyiciye iletilir.

+0

Cevabınız için teşekkür ederiz, Greg. İyi bir kod üreteci yazmak için daha fazla zaman harcanır ve makrolar işlerin halledilmesi için hızlı bir hack gibi görünür. – Viet

+0

++ Görüşlerim tam olarak. Önişlemden geçmenin bir yolu olsaydı iyi olurdu. Yine de, kod üretimi yeterince basitse makroları tercih ederim. –

9

C++ için şablon meta programlamayı veya makrolar üzerinde kod oluşturmayı tercih ediyorum ancak makroların hala kullanımları var.

Eğer dbtemplatelib ile verdik örnek

Bu bir değiş tokuş vb

+0

Öneriniz için teşekkürler. Şablonların da kendi erdemleri vardır. Variadic makrolar var ama C++ 0x hala yeni olduğu için variadic şablonlar henüz popüler değil. – Viet

+0

Eh, tam olarak, henüz daha yok, ve bir "C++ 1x" olacak. Ancak, bazı derleyicilerde varadik şablonlar uygulanmaktadır, örneğin, bunları gcc ile kullanmak için, derleyici anahtarı olarak "-std = C++ 0x" eklemeniz gerekir. – hirschhornsalz

3

Her ikisinin de sorunları var. Makrolar, makroların aksine, okunabilir ve hata ayıklanabilir (bu bile bir kelime mi?) Kodu oluşturabilir, ancak daha az esnek ve değişmesi daha zordur.

+0

+1. Cevap için teşekkürler. – Viet