Mam następujący problem:priorytet przy wyborze przeciążone funkcje szablonów w C++
class Base
{
};
class Derived : public Base
{
};
class Different
{
};
class X
{
public:
template <typename T>
static const char *func(T *data)
{
// Do something generic...
return "Generic";
}
static const char *func(Base *data)
{
// Do something specific...
return "Specific";
}
};
Gdybym teraz zrobić
Derived derived;
Different different;
std::cout << "Derived: " << X::func(&derived) << std::endl;
std::cout << "Different: " << X::func(&different) << std::endl;
uzyskać
Derived: Generic
Different: Generic
Ale co chcę jest, że dla wszystkich klas wyprowadzonych z Bazy wywoływana jest określona metoda. więc wynik powinien być:
Derived: Specific
Different: Generic
Czy jest jakiś sposób mogę przeprojektować X: func (...) s, aby osiągnąć ten cel?
EDIT:
Załóżmy, że nie jest znany przez dzwoniącego X :: func (...) jeśli klasa przedstawiła jako parametr pochodzi z bazy, czy nie. Więc Casting to Base nie jest opcją. W rzeczywistości ideą leżącą u podstaw tego wszystkiego jest to, że X :: func (...) powinien "wykryć", jeśli parametr wywodzi się z bazy i nie wywoływać innego kodu. A ze względów wydajnościowych "wykrywanie" powinno odbywać się w czasie kompilacji.
+1, powinienem był o tym pomyśleć. Ta sztuczka jest faktycznie używana w STL do wybierania między różnymi wersjami algorytmów opartych na kategorii przekazywanych iteratorów. – avakar
Pamiętaj o wersji "Zwiększ", ale będzie działać z innymi cechami niż wymienialność. – avakar
dzięki za ogłoszenie, to naprawdę dobre rozwiązanie. – ttvd