Aşağıdaki sınıfı göz önünde bulundurun: iç yapısı Y
tür olarak kullanılıyor, örn. daha sonra şablonları, içinde: Koşullu derleme zamanı şablon argümanlarına dayalı kodun eklenmesi/hariç tutulması?
template<int I>
class X{
template<class T1>
struct Y{};
template<class T1, class T2>
struct Y{};
};
Şimdi, bu örnek açıkça ikinci
X<I>::Y
zaten tanımlı edildiğini hata ile, derlemek ya da çok sayıda şablon parametresi vardır olmayacaktır.
int I
parametresi yalnızca bir tane değil ve onun konumu farklı kısmi uzmanlıklarda farklılık gösterebileceğinden (ek) kısmi uzmanlık olmadan bunu çözmek istiyorum (benim gerçek yapım
more like this olarak görünüyor, yukarıdaki sadece basitlik içindir) soru), bu yüzden
one class fits every I
çözümü istiyorum.
ilk düşüncem açıkçası enable_if
, ama bu, bana mesela başarısız gibi görünüyor. Ben hala aynı hataları alıyorum:
template<int I>
class X{
__include_if(I == 1){
template<class T1>
struct Y{};
}
__include_if(I == 2){
template<class T1, class T2>
struct Y{};
}
};
Sadece olurdu: enable_if
başarısız beri
// assuming C++11 support, else use boost
#include <type_traits>
template<int I>
class X{
template<class T1, class = std::enable_if<I==1>::type>
struct Y{};
template<class T1, class T2, class = std::enable_if<I==2>::type>
struct Y{};
};
yani, ben şu derleme zamanı kontrol ulaşmak için başka bir yol yoktur umut kod çoğaltmanın bir çok kurtarmak için olmak, ama bir şekilde mümkün olsaydı gerçekten çok mutlu olurdum.
Düzenleme: Ne yazık ki, Visual Studio 2010 kullandığım gibi, bariz: variadic şablonları kullanamıyorum, bu yüzden yalnızca orada desteklenen desteklenen C++ 0x şeyler. :/
+1. İlginç soru. Ofis saatinden sonra cevap vermeye çalışacağım: D – Nawaz
Zevkle bekliyorum. :) Düşünce çizgim, derleyicinin bilmesi gereken herşeyi iyi bildiği gibi derlemenin mümkün olması gerektiğidir. – Xeo
@Xeo: C++ 0x özelliklerini kullanabiliyor musunuz? – Nawaz