Re: Template and function pointer question
On Oct 15, 9:50 pm, Erik Wikström <Erik-wikst...@telia.com> wrote:
> On 2007-10-15 21:09, webinfin...@gmail.com wrote:
> > This is my first post here, please tell me if I did anything wrong.
> > in the following code snippet:
> > 1. template <class In, class Pred>
> > 2. In find_if(In begin, In end, Pred f) {
> > 3. while (begin != end && !f(*begin))
> > 4. ++begin;
> > 5. return begin;
> > 6. }
> > 7. bool is_negative(int n) {
> > 8. return n < 0;
> > 9. }
> > 10. vector<int>::iterator i = find_if(v.begin(), v.end(),
> > is_negative);
> > find_if is the template needs a class Pred as its third argument but
> > in line 10's function call, it takes a function poniter is_negative,
> > does that mean in C++, function point is equivalent to class?
> No. If you rewrite the template thingie like this instead
> template <typename In, typename Pred>
> In find_if(In begin, In end, Pred f)
> it might become a little more clear, the types of In and Pred are
> determined when the code is compiled, and it does not have to be a
> class, anything that is a type will do.
Anything which fulfills the constraints of the template. In
this case, any type which can be called ("()" operator) with a
single argument of the iterator value type, and returns
something which converts to bool.
For various historical reasons, the () operator can be applied
to a pointer to a function, as well as to a function. In
pre-template days, this was often considered a defect in the
language---a flaw in the type system. Serendipitously, it turns
out to be an advantage with templates, where duck typing is the
rule.
And of course, in C++, a pointer to a function type is an object
type, just like a class.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|