Gerçek örneğim oldukça büyüktür, bu yüzden basitleştirilmiş bir kullanacağım. örneğinİşaretçiler, değerler ve akıllı işaretçiler için C++ şablonları birleştirme
struct Rectangle {
int width;
int height;
int computeArea() {
return width * height;
}
}
Ve bu tür tüketir başka bir tür,: Ben bir dikdörtgen için veri türü olduğunu varsayalım Şimdi
struct TwoRectangles {
Rectangle a;
Rectangle b;
int computeArea() {
// Ignore case where they overlap for the sake of argument!
return a.computeArea() + b.computeArea();
}
};
, ben kullanıcıları üzerinde mülkiyet kısıtlamaları koymak istemiyoruz
template<typename T>
struct TwoRectangles {
T a;
T b;
int computeArea() {
// Ignore case where they overlap for the sake of argument!
return a.computeArea() + b.computeArea();
}
};
kullanımları:
, o yüzden bir şablon yapmak istiyorum 210sorun arayan işaretçileri kullanmak isterse, fonksiyonun gövdesi farklı olmasıdır:
template<typename T>
struct TwoRectangles {
T a;
T b;
int computeArea() {
assert(a && b);
return a->computeArea() + b->computeArea();
}
};
kod Maksimum sayı miktarı böylece benim şablon işlevi birleştirme en iyi yolu nedir
işaretçiler, değerler ve akıllı işaretçiler için yeniden kullanılır? Size bu ifadelerin ikisi de geçerli olan için bir türüne sahip ihtimali düşüktürtemplate<typename T>
struct TwoRectangles {
T a;
T b;
int computeArea() {
return areaOf(a) + areaOf(b);
}
private:
template <class U>
auto areaOf(U& v) -> decltype(v->computeArea()) {
return v->computeArea();
}
template <class U>
auto areaOf(U& v) -> decltype(v.computeArea()) {
return v.computeArea();
}
};
:
Uygulanamaz olanları dışlamak için SFINAE ile bir sürü aşırı yüklenme yazabilirsiniz. Ya da sadece ihtiyaç duyduğunuz şeylerle başa çıkmak için tasarımınızı değiştirebilir ve ihtiyacınız olana kadar ihtiyaç duyabileceğiniz şeyleri dışarıda bırakabilirsiniz. –
Yalnızca '->' kullanın. İşaretçi olmayan değerleri özel işaretçi benzeri nesnelere sarın. –
Standart kütüphaneyi yapabilir ve ona ek bir şablon türü verebilirdiniz. Bu, "T" yi nasıl çekeceğini ve "computeArea" öğesini nasıl çağırdığını "bilen bir özelliktir. Ya da aşırı mühendisliğe değil. :) – GManNickG