Weer eens even een echte C++ topic (dus niet zo'n C++ topic waar iedereen alleen maar over C lult
), over het afleiden van template parameters uit function call argumenten en zo.
Zoals jullie allemaal weten, is het mogelijk om template parameters af te laten leiden van de argumenten die je aan een template functie geeft:
In main wordt impliciet f<int>(i) aangeroepen, en dit kan je bij de wat complexere templates heel wat typwerk besparen.
Wat mij nou wel handig leek, is als we dit zelfde foefje ook voor template classes konden gebruiken; dus de template parameters laten afleiden uit de constructor parameters:
In deze code zou o dus een object worden van het type s<int>.
Nou las ik in mijn C++ boek (TC++PL), dat dit niet kan. De reden zou zijn dat het een zooitje zou worden aangezien je meerdere constructors etc kan hebben in een class. (ik heb mn boek er hier niet bij dus ik kan helaas ff niet citeren (doe ik wel ff als ik thuis ben).) Ik snap hier echter niks van, want normale functions kun je net zo goed overloaden.
Iemand op irc vertelde me dat de compiler in sommige gevallen niet zou weten wat ie ervan moest maken, maar ook dit is net zo goed het geval bij template functions.
Dus mijn vraag is nog steeds: wat is nou de echte reden dat dit niet kan ? (niet dat Stroustrop me loopt te besodemieteren, ik begrijp alleen zijn uitleg niet..)
Zoals jullie allemaal weten, is het mogelijk om template parameters af te laten leiden van de argumenten die je aan een template functie geeft:
code:
1
2
3
4
5
6
7
8
| template <class C>
void f (C) {}
int main ()
{
int i;
f (i);
} |
In main wordt impliciet f<int>(i) aangeroepen, en dit kan je bij de wat complexere templates heel wat typwerk besparen.
Wat mij nou wel handig leek, is als we dit zelfde foefje ook voor template classes konden gebruiken; dus de template parameters laten afleiden uit de constructor parameters:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| template <class C>
struct s
{
s (C)
{}
};
int main ()
{
int i;
s o (i);
} |
In deze code zou o dus een object worden van het type s<int>.
Nou las ik in mijn C++ boek (TC++PL), dat dit niet kan. De reden zou zijn dat het een zooitje zou worden aangezien je meerdere constructors etc kan hebben in een class. (ik heb mn boek er hier niet bij dus ik kan helaas ff niet citeren (doe ik wel ff als ik thuis ben).) Ik snap hier echter niks van, want normale functions kun je net zo goed overloaden.
Iemand op irc vertelde me dat de compiler in sommige gevallen niet zou weten wat ie ervan moest maken, maar ook dit is net zo goed het geval bij template functions.
Dus mijn vraag is nog steeds: wat is nou de echte reden dat dit niet kan ? (niet dat Stroustrop me loopt te besodemieteren, ik begrijp alleen zijn uitleg niet..)