:Şablon meta kod ve özel üyeler
template <typename T>
class Foo
{
...
public:
void DoSomething()
{
compile_time_if (T is ClassA)
{
m_T.DoThingOne();
m_T.DoThingTwo();
}
DoSomeFooPrivateThing();
m_T.DoThingThree();
}
T m_T;
};
Bu durumda ben tüm geçerli T
DoThingThree
uygulamak biliyorum, ama sadece ClassA
DoThingOne
ve DoThingTwo
uygular. Bu ördek tipi bir şey değil, sadece ClassA
için bu ekstra parçayı yapmak istiyorum ve bu yöntemleri diğer olası T
s eklemek istemiyorum. Döküm yapamam, çünkü olası T
s miras alınan türler değil. sınırlar
template <typename T>
void Foo_DoSomething(T& t)
{
t.DoThingThree();
}
template <>
void Foo_DoSomething(ClassA& t)
{
t.DoThingOne();
t.DoThingTwo();
t.DoThingThree();
}
template <typename T>
class Foo
{
...
public:
void DoSomething()
{
Foo_DoSomething(m_T);
}
...
};
Ancak şimdi Foo
özel üyelerine erişimi yok bu dış şablonu (DoSomeFooPrivateThing
diyemezsin):
Ben bu karşılamak için harici yardımcı şablonunu kullanabilirsiniz biliyoruz işlevselliği ve dışarıdan, açıkça hoş olmayan dışa açık.
template <typename T>
class Foo
{
...
public:
void DoSomething()
{
DoSomethingImpl(m_T);
}
...
private:
template <typename T2>
void DoSomethingImpl(T2& t)
{
DoSomeFooPrivateThing();
t.DoThingThree();
}
template <>
void DoSomethingImpl(ClassA& t)
{
t.DoThingOne();
t.DoThingTwo();
DoSomeFooPrivateThing();
t.DoThingThree();
}
...
};
Ama bu dış şablon tipi ve parametre çoğaltarak gerektirir: (. Arkadaş sadece kötü şeyler yapar harici yöntem Yapımı)
başka görünüşte-makul seçenek dahili olarak uygulamaktır. Bu muhtemelen kabul edilebilir, ama yine de biraz garip geliyor. Ne yazık ki, aslında derlemiyor (en azından GCC'de değil, sınıflardaki uzmanlıklara itiraz ediyor).
Bunu yapmanın daha iyi bir yolu var mı?
Evet, bu varyantı denediğimi ve işe yaradığını söylemek için soruyu güncellemek üzereydim. Teknik olarak belirsiz ama neyse ki açık aşırı yükler her zaman şablonlar üzerinde kazanıyor. Yine de, ilk parametrede şablon parametresinin hafifçe tahriş edici çoğaltılmasını gerektirir (çünkü bu, gerçekten bir belirsizlik yaratabilir) - ama bununla yaşayabilirim. – Miral