2010-05-25 27 views
6

Bir önişlemci yönergesinde tip olmayan bir sabit şablon parametresi kullanmak mümkün mü? İşte aklında ne:Bir önişlemci yönergesinde şablon parametresi kullan?

template <int DING> 
struct Foo 
{ 
    enum { DOO = DING }; 
}; 

template <typename T> 
struct Blah 
{ 
    void DoIt() 
    { 
     #if (T::DOO & 0x010) 

     // some code here 

     #endif 
    } 
}; 

Ben Blah<Foo<0xFFFF>> gibi bir şeyle bu çalıştığınızda, VC++ 2010 biz #if kullanmaya çalışıyorlar doğrultusunda eşsiz parantez hakkında bir şeyler şikayet ediyor. Önişlemcinin şablonlar hakkında hiçbir şey bilmediğini ve bu tür bir şeyin sadece kendi alanında bulunmadığını tahmin ediyorum. Ne diyosun

+0

Sadece bir nokta not: Örneğin: 'Falan >', sen '>' s arasında bir boşluk gerekir ++ cari c ayrıştırmak olmaz. Blah >. – KitsuneYMG

+0

Aslında, VC++ 2010'da derleme yapıyor! :) VC++ 2010'da kısmen C++ 0x uyguladılar. – Raj

cevap

11

Hayır, bu mümkün değil. Önişlemci oldukça aptal ve programınızın yapısı hakkında hiçbir bilgiye sahip değil. Önişlemcisinde T::Doo tanımlanmamışsa (ve :: yüzünden olamaz), bu ifadeyi değerlendiremez ve başarısız olur.

 if (T::Doo & 0x010) { 
      // some code here 
     } 

Sabit ifadeleri ve ölü dalları daha düşük iyileştirme ayarları uzakta optimize edilmiştir, bu nedenle güvenle herhangi olmadan yapabilirsiniz:

Ancak, sizin için akıllı bir şey yapmak için derleyici güvenebilirsiniz çalışma zamanı yükü. üyeleri T geçerli olacak

+0

"Doo", "T" içinde mevcut değilse, bu derleme başarısız olmaz mı? –

+0

Teşekkürler. Bende böyle düşünmüştüm. Ancak derleyiciyi kullanmak benim için uygun değil çünkü “T” içinde hangi üyelerin var olduğu, T :: DOO'da hangi bitlerin ayarlandığına bağlıdır. Eminim yanlış yöne yaklaşıyorum. Başka bir şey anlatacağım. Ancak, ön işlemciyle ne kadar ileri gidebileceğimizi merak ediyorduk. Şablon meta programlama püf noktalarının bunun için kullanılıp kullanılamayacağını görmek için başka bir seçenek de olabilir. – Raj

+0

Muhtemelen yapabilirler. Neyi başarmak istediğinizle ilgili yeni bir soru açarsanız, bir göz atabiliriz. – Thomas

2

hangi bit T::DOO

ayarlanır Bir alt sınıf tanımlayıcı gibi davranıyor T::DOO gibi geldi bağlıdır. Bu yüzden, Foo ve ilgili sınıflarınızın, DOO'un tanımlandığını garanti eden bir sınıfın alt sınıfları olması gerektiğini düşünüyorum.

Anahtar şudur: neden biraz alan kullanmalısınız?

+0

Bunun cevabı biraz karışıyor ama tam olarak haklısınız. Yöntemlerden birine girdi olarak iletilen belirli bir yapının içeriğini nasıl biçimlendirmek istediğinizi belirtmede belirli bir esnekliğe izin veren bu API (DirectX) ile çalışıyorum. Yapı kurulumuna nasıl sahip olduğunuza dair bilgi, bir bit alanından geçirilir. Uygulamamda 2 soyutlama var. Bunlardan ilki, bu yapının örneklerini, bit-alanı ve şablon argümanı olarak geçirilen yapısı ve bu koleksiyonu tüketen bir diğeriyle oluşturuyor. Yorum devamı – Raj

+0

'un altında Tüketici sınıfında, bu alanın belirli üyelerinden yararlanarak, bit alanında hangi bitlerin ayarlandığını inceleyerek bazı koşullu kod yazmak istedim. Uf! Bunun ne kadar anlamlı olduğundan emin değilim! Yapının farklı varyantları ile haritalanmış kaynak sınıfının çeşitli şablon örneklemeleri olduğundan, söz konusu kodun şartlı olarak derlenmesi gerekir - bu nedenle önişlemcinin kullanılabileceğini görmeye çalışmak fikri. – Raj

1

Durumunuz için geçerli olup olmadığından emin değilsiniz, ancak farklı durumları şablon sınıflarıyla ayırmak mümkündür. (Yukarıdan Kodunuzdaki değiştirilmiş bir versiyonunu kullanarak)

template <typename T, int N> 
struct Blah 
{ 
    void DoIt() 
    { 
     // normal DoIt() code 
    } 
}; 

template <typename T> 
struct Blah<T,5> 
{ 
    void DoIt() 
    { 
     // special DoIt() code for only when N==5 
    } 
}; 
İlgili konular