M
Hi Forum,
ich habe es hin bekommen Nachdem ich mir den Quelltext von MPL etwas genauer angesehen habe, weiß ich wie es funktioniert und damit der Thread als gelöst gekennzeichnet werden kann, will ich mal den Weg aufzeigen, wie solch ein Prädikat aussehen muss. Hier ist der Quelltext des Prädikates
template<typename A, typename B>
struct equal {
static const int value=is_same<typename A::slot_id, B>::value;
};
Eigentlich ja einfach, aber muss man erst einmal drauf kommen, warum es so geht und der/die anderen Weg nicht funktioniert haben. Ok die Erklärung:
Es handelt sich also um eine Metafunktion und der entscheidende Punkt war die Definition des value. Ich hatte unter anderem auch versucht direkt von is_same zu erben, wodurch der value von is_same kommt. Aber: Bei der Instantiierung von equal wurde dann auch is_same direkt instantiiert und auf den eingekapselten Typ zugegriffen, der bei einem Placeholder nicht existiert. Wenn ich die Definition des value aber in equal reinschreibe, wird dieser Ausdruck erst ausgewertet, wenn auf value zugegriffen wird. Dies geschieht in einem Kontext, wo der Placeholder durch das aktuelle Element der Sequenz ersetzt wird. Dieser Typ hat den eingekapselten Type slot_id und diesen kann ich dann vergleichen.
Und hier der restliche Quelltext, um zu zeigen wie equal jetzt benutzt werden kann.
template<int i>
struct Slot {
typedef Slot type;
typedef int_<i> slot_id;
};
typedef vector<Slot<0>, Slot<10>, Slot<15> > slots;
typedef find_if<slots, equal< _1, int_<10> > >::type t10;
BOOST_MPL_ASSERT(( is_same< deref<t10>::type, Slot<10> > ));
Jetzt arbeitet alles so, wie es soll