Guten Tag,
ich habe folgendes Problem.
Ich habe einen Header, in dem ich ein paar freie Funktionen definiert habe, welche alle Templates sind.
Manche der Funktionen haben eine genauere Definition der übergebenen Parameter, als andere.
Hier mal 2 Beispiele:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
template<class T>
std::set<PointF> intersections(const LineBase<T>& first, const LineBase<T>& other)
{
// ...
}
template <class Geo1, class Geo2>
std::set<PointF> intersections(const Geo1& first, const Geo2& second)
{
//...
}
|
LineBase ist die Basisklasse meiner Lines, welche einen Templateparameter des zu haltenden Datentyps (int, float, etc.) erwartet. An die Funktion werden allerdings nur ausdefinierte Childklassen übergeben.
Die 2. Überladung erwartet 2 Typen von egal welcher Geometrie Klasse (also, Line, Rechteck, Parallelogramm, etc.).
Ich mache also folgendes:
|
C-/C++-Quelltext
|
1
2
3
|
GEOMETRY::Line line1(p1, p2);
GEOMETRY::Line line2(4, 1, 5, 7);
auto& p : GEOMETRY::intersections(line1, line2);
|
Ich erstelle mir 2 Linien, und prüfe ob sie sich überschneiden, und wenn ja, wo (Schnittpunkte werden im set zurück geliefert).
Und hier kommen wir zum eigentlichen Problem.
Es wird jetzt Überladung 2 aufgerufen, obwohl ich eigentlich möchte, das Überladung 1 aufgerufen wird.
Das ist auch soweit logisch, dass das so geschieht, nur wie löse ich nun das Problem?
Es ist zwingend notwendig, das für spezielle Typen, spezielle Überladungen aufgerufen werden. Da es aber für jede Geometrie 2 abgeleitete Klassen gibt (Von LineBase erbt Line und LineF, wobei LineF die float Variante ist) würde ich das ganz gerne über die Basisklasse regeln, um eben Redundanzen zu vermeiden.
Meine Überlegung war daraufhin, für alle Geometrieklassen eine Grundlegende Basisklasse zu schaffen, sodass ich hier besser unterscheiden kann.
Welche Möglichkeiten habe ich denn jetzt, oder kann mir jemand ein besseres Design vorschlagen, auf welches ich nicht komme?
mfg