Έχω το εξής πρόβλημα:
Φτιάχνω μια βιβλιοθήκη επίλυσης Constraint Satisfaction Problems. Σαν
ιδέα, κάτι σαν αυτό που κάνει η Eclipse. Χοντρικά, υπάρχουν μεταβλητές
οι οποίες έχουν κάποιο πεδίο τιμών, και περιορισμοί μεταξύ των
μεταβλητών. Για παράδειγμα:
Χ = [1,2,3,4,5]
Υ = [1,2,3]
Μπορούμε να βάλουμε τον περιορισμό Χ = Υ + 3, οπότε θα πάρουμε τις εξής δύο λύσεις:
Χ = 4, Υ = 1
Χ = 5 , Υ = 2
Έχω λοιπόν υλοποιήσει κλάσεις CS_IntVar, CS_Constraint κτλ.
Θέλω ο προγραμματιστής να μπορεί να δηλώνει μια CS_IntVar "εύκολα", μαζί με ένα περιορισμό, κάτι τέτοιο:
CS_IntVar X = Y + 3.
Έχω κάνει overload τον operator+ ως εξής:
public static CS_IntVar operator +(CS_IntVar Y, int C)
{
CS_IntVar var = new CS_IntVar(Y.Problem, Y.min() + C, Y.max() + C);
var.Problem.add_variable(var);
//Create the constraint
var.Problem.add_constraint(new CS_Constr_X_eq_Y_plus_C(var, Y, C));
return var;
}
όπου Y.Problem είναι το πρόβλημα στο οποίο ανήκουν οι μεταβλητές.
Ως εδώ όλα δουλεύουν μια χαρά. Θέλω όμως, να μπορεί ο προγραμματιστής
να "επιβάλλει" ένα περιορισμό ακόμα και αν έχει ήδη δημιουργήσει τις
μεταβλητές. Δηλαδή:
CS_IntVar X = new CS_IntVar(...);
CS_IntVar Y = new CS_IntVar(...);
...
X = Y + 3.
Φαντάζομαι ότι ο operator= θα πρέπει να είναι κάποιος άλλος τον οποίο θα κάνω overload. Πώς μπορώ να το πετύχω αυτό;
Υπάρχει τρόπος να ορίσω τους δικούς μου (καινούριους) τελεστές; (ή να
μπορώ να καλώ μια συνάρτηση όπως έναν operator, δηλ x = y func c)
Γίνεται να ορίσω ένα τελεστή που να επιστρέφει void;
Ευχαριστώ πολύ!