K
Dravere schrieb:
Edit:
Bezüglich des Edits von filmor,
Daran hatte ich auch schon gedacht, bzw. vor allem an die zweite Möglichkeit. Aber das würde die Situation nicht vereinfachen, welche ich versuche zu vereinfachen:
template<typename TNode>
CNodeIterator<t_NodeList::const_reverse_iterator, TNode>
rbegin(t_NodeList const& rNodeList)
{ return CNodeIterator<t_NodeList::const_reverse_iterator, TNode>(rNodeList.rbegin(), rNodeList.rend()); }
Das ist das extremste. Wäre halt praktischer, wenn man den Rückgabetyp kürzer schreiben könnte
Ich arbeite gerade an einer Bibliothek mit, wo wir dieses Problem dauernd und in noch schlimmerer Form haben.
Ein übliches Idiom ist bei uns sowas hier:
template <typename TIter, typename TNode>
struct NodeIter {
typedef CNodeIterator<TIter, TNode> Type;
};
template<typename TNode>
CNodeIterator<t_NodeList::const_reverse_iterator, TNode> rbegin(t_NodeList const& rNodeList)
{
typedef typename NodeIter<t_NodeList::const_reverse_iterator, TNode> TRet;
return TRet(rNodeList.rbegin(), rNodeList.rend());
}
Structs dieser Art nennt man „Metafunktionen“, da sie analog zu Funktionen Eingabe- und einen Rückgabewert haben, nur eben auf Typenebene (daher „meta-“), also statt Werteparametern Typenparameter und einen Typ als Rückgabewert. Analog zu 'return' schreibt man 'typedef … Type;'. Der „Aufruf“ einer Metafunktion läuft eben über den Zugriff auf diesen typedef ab.
Wobei man diese Metafunktionen sogar durch (partielle) Spezialisierung „überladen“ kann. Sie machen Den Code also gar nicht unbedingt kürzer, heben aber eine Kopplung an konkrete Typen auf.
(Falls jemand neugierig ist: http://www.seqan.de/)