FormkreuzungsdesignC++

Programme in C++. Entwicklerforum
Anonymous
 Formkreuzungsdesign

Post by Anonymous »

Ich hoffe, dass diese Frage nicht als meinungsbasiert oder so betrachtet wird. Obwohl es bei der Frage um die Schnittmenge von Formen geht, ist das beschriebene Problem recht allgemein (z. B. wie kann man eine Funktionsvorlage erstellen, die ihre Vorlagenparameter nicht ordnet usw.).
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
Meine bisherigen Versuche
Nur eine Funktion
Ich habe darüber nachgedacht, eine Funktionsvorlage zu erstellen

Code: Select all

template
intersect(const A&, const B&)
aber mit verschiedenen Kombinationen und dann eine „Fall-Through“-Kette erstellen (wenn eine nicht spezialisiert ist, gehen Sie zur nächsten):

Code: Select all

(b, a) -> (a, b) -> (a, b) -> (a, b)
Etwas in der Art:

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);
}
Aber es funktioniert aus verschiedenen Gründen nicht.
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);
}
};
Und seine Verwendung ist die folgende

Code: Select all

Hexagon h;
Triangle t;
I::intersect(h, t)
Aber selbst wenn wir eine hässliche Art, den Algorithmus zu spezifizieren, ignorieren, funktioniert es auch nicht.
Jetzt bitte ich um Hilfe. Wie würden Sie das lösen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post
  • Formkreuzungsdesign
    by Anonymous » » in C++
    0 Replies
    0 Views
    Last post by Anonymous