Boost MPL (ve genel olarak meta programlama) konusunda oldukça yeniyim ve bence şablonlar ve tipler fikriyle kafam karıştı. Çalıştığım basit bir örnek, bir vektörün uzunluğunu hesaplamaya çalışıyor. Aşağıdaki ince derler:Boost MPL Türleri Vs Şablonları
sonrastruct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence>::type type;
};
};
typedef TestSize::apply<myVector>::type result;
alıyorum hata "hata: metalik konstrüksiyonları" boost
typedef mpl::vector_c< int, 0, 1, 2, 3, 4, 5, 6, 7 > myVector;
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
};
};
typedef TestSize::apply<myVector>::type result;
ama böyle, boyut hesaplama sonucuna ":: type" eklerseniz :: mpl :: size :: type [ile Sekans = mySequence] "bir tür ismi değil".
Bu, iç içe geçmiş bir ad alanında olduğu için şablon parametresinin çıkarılmadığı bir durum mu? Aslında benim karışıklığa olduğunu eklemek, o aşağıdaki derler:
struct TestSize
{
template <typename mySequence> struct apply
{
typedef mpl::size<mySequence> type;
typedef mpl::range_c<int, 0, type::type::value> myRange;
};
};
typedef TestSize::apply<myVector>::type result;
typedef TestSize::apply<textureIndices>::myRange range;
Neden yapabilirim "tip :: tip :: değerini" Orada, ama daha önce on line değil "boyutu < mySequence> :: türü"? Eğer (iç apply
olarak) böyle typename
kullanmak gerekir, çünkü
@ user1777820, sadece böyle bir Pandora kutusu açtı! Kısacası, nedeni şu ki, mpl :: size :: type' * şablona bağlı bir * addır. 'T' nin sematici, T 'nin aslında ne olduğuna bağlı olarak farklı olurdu - bir fonksiyon, bir tür, bir değişken olabilir… Her şey. Diğer taraftan, "" boyutunun sematikleri "T" ye bağlı değildir - ne olursa olsun "T", boyut 'sadece bir şeydir - daha önce tanımlanmış şablon sınıfının 'boyut' şablon örneği. Hiçbir belirsizlik, bu yüzden ipucu gerek yok. –
SergeyA
Yeni bir soruya başlayacağım için yorumumu sildim, bu yüzden gelecekte bunu okuyan herkes için ekliyorum. Buradaki çözümün, typename ipucunu kullanarak, ilk kod örneğimden "typedef mpl :: size type;" satırıyla nasıl farklılaştığını soruyordum. hangi iyi derler. Teşekkürler @SergeyA! –
user1777820