Es handelt sich auch nicht um eine Hausaufgabe. Ich wurde vor etwa einem Jahr danach gefragt und konnte es dann nicht schnell lösen. Vor Kurzem hat mir diese Aufgabe wieder ihr Gesicht gezeigt. Und ich fing an, daran zu arbeiten.
Ich habe ein paar Tage lang versucht, es zu lösen, ohne Erfolg, deshalb habe ich beschlossen, Gurus um Hilfe zu bitten
Angenommen, ich habe verschiedene Arten von Formen: Dreieck, Kreis, Sechseck (aber nicht darauf beschränkt, der Benutzer kann seine eigenen hinzufügen). Und nehmen wir an, ich möchte eine Möglichkeit haben, diese Typen zu überschneiden. Für jedes mögliche Paar (A, B) gehe ich davon aus, dass der Benutzer seinen Algorithmus definieren kann, wie die Formen im Paar intersect(A,B) geschnitten werden. Aber ich möchte das folgende Design erreichen:
- Der Benutzer darf entweder intersect(B, A) oder intersect(A, B) definieren.
- Wenn der Benutzer sowohl intersect(A, B) als auch intersect(B, A) definiert hat, wird das Programm nicht kompiliert.
- Ich möchte keine Laufzeit Polymorphismus (kein Dynamic_cast oder irgendein anderes RTTI). Ich würde es gerne mit der Vorlagenmagie lösen.
- nur C++17
Nur eine Funktion
Ich habe darüber nachgedacht, eine Funktionsvorlage zu erstellen
Code: Select all
template
intersect(const A&, const B&)
Code: Select all
(b, a) -> (a, b) -> (a, b) -> (a, b)Code: Select all
template
void intersect(const A& a, const B& b)
{
static_assert(false, "No intersection algorithm found");
}
template
void intersect(const B& b, const A& a)
{
intersect(a, b);
}
Eine Klassenvorlage mit einer statischen Methode
Code: Select all
template
struct Intersector
{
typedef void Fake;
static void intersect (const A&, const B&)
{
static_assert(false, "Default");
}
};
template
struct Intersector
{
typedef int Fake;
static void intersect(const Hexagon&, const Triangle&)
{
std::cout
static void intersect(const A& a, const B& b)
{
Intersector::intersect(b, a);
}
};
Code: Select all
Hexagon h;
Triangle t;
I::intersect(h, t)
Jetzt bitte ich um Hilfe. Wie würden Sie das lösen?
Mobile version