Nieuwe objecten in STL containers kun je meestal laten copy-constructen van een gegeven 'source' object, bijvoorbeeld:
code:
1
2
| void std::vector<T>::push_back (T const & r);
// het nieuwe object wordt ge-copy-construct met r |
Het is (met de huidige std::vector interface) niet mogelijk om nieuwe objecten direct door een constructor naar keuze (met willekeurige parameter-combinaties) te laten constructen. Deze inflexibiliteit zorgt ervoor dat er vaak (conceptueel overbodige) temporaries nodig zijn:
code:
1
2
3
4
5
6
7
| struct S { S (int, int) {} };
void f ()
{
std::vector<S> v;
v.push_back(S(0,0)); // helaas per sé een temporary nodig
} |
Er wordt hier een object aangemaakt dat nadat het gekopieerd is meteen weer weggegooid wordt. Ik vind dit lelijk, en volgens mij kan het beter.
Door de volgende functies aan std::vector toe te voegen:
code:
1
2
3
4
5
6
7
8
9
10
| template <typename A>
void direct_push_back (A a);
template <typename A, typename B>
void direct_push_back (A a, B b);
template <typename A, typename B, typename C>
void direct_push_back (A a, B b, C c);
etc. |
en deze functies de parameters te laten doorgeven aan de constructor van het nieuwe object, kan de gebruiker het object direct 'op locatie' (in de controlled sequence) laten constructen door een constructor naar keuze:
code:
1
2
3
4
5
| void g ()
{
std::vector<S> v;
v.direct_push_back(0, 0); // geen temporary nodig
} |
Ziet er goed uit, nietwaar?
Mijn onvermijdelijke vragen zijn dan ook: Waarom zit dit niet in de STL? Wat is hier mis mee? Wat zie ik over het hoofd? (Ik heb deze constructie reeds uitgeprobeerd met de met mijn compiler meegeleverde STL, en het werkt prima.)