Specjalizacja szablonów C ++, wywoływanie metod na typach, które mogą być wskaźnikami lub odniesieniami jednoznacznie

streszczenie

Czy istnieje sposób wywołania metody klasy na typie szablonowym, który mógłby być wskaźnikiem lub referencją, nie wiedząc, które i nie otrzymają błędów kompilatora / linkera?

Detale

Mam szablonową implementację QuadTree, która może przyjąć dowolny z następujących nietrywialnych typów zdefiniowanych przez użytkownika:

//Abstract Base Class
a2de::Shape

//Derived Classes
a2de::Point
a2de::Line
a2de::Rectangle
a2de::Circle
a2de::Ellipse
a2de::Triangle
a2de::Arc
a2de::Spline
a2de::Sector
a2de::Polygon

Ale mogą to być wskaźniki LUB referencje, ponieważ wszystkie pochodzą od a2de :: Shape. Więc specjalizacje są zadeklarowane jako:

template class QuadTree<a2de::Shape&>;
//...similar for all derived types as references.

template class QuadTree<a2de::Shape*>;
//...similar for all derived types as pointers

Problem, który mam, to możliwość wywołania metody klasowej, gdy orientacja (lub jej brak) jest nieznana i ze względu na szablony generowane są oba zestawy kodu:

template<typename T>
bool QuadTree<T>::Add(T& elem) {

    //When elem of type T is expecting a pointer here
    //-> notation fails to compile where T is a reference i.e.:
    //template class QuadTree<a2de::Shape&>
    //with "pointer to reference is illegal"

    if(elem->Intersects(_bounds) == false) return false;

    //...
}

Jeśli zmienię powyższą linię, aby użyć. (kropka) notacja:

template<typename T>
bool QuadTree<T>::Add(T& elem) {

    //When elem of type T is expecting a reference here
    //. (dot) notation fails to compile where T is a pointer i.e.:
    //template class QuadTree<a2de::Shape*>
    //with "pointer to reference is illegal"

    if(elem.Intersects(_bounds) == false) return false;

    //...

}

Jeśli usunę typy oparte na referencjach na korzyść typów opartych na wskaźnikach (w tym w deklaracji i użyciu klasy Quadtree) otrzymuję błądleft of .<function-name> must have class/struct/union.

Jeśli usunę typ oparty na wskaźnikach na korzyść typów opartych na referencjach (w tym w deklaracji i użyciu klasy Quadtree) otrzymam wspomniane wcześniejreference to pointer is illegal jeszcze raz.

kompilator: VS2010-SP1

questionAnswers(1)

yourAnswerToTheQuestion