Re: Templates HowTo?
On Feb 22, 10:18 am, "Alf P. Steinbach" <al...@start.no> wrote:
* James Kanze:
On Feb 21, 10:20 am, "Alf P. Steinbach" <al...@start.no> wrote:
* ke...@bytebrothers.co.uk:
I must confess I'm completely new to templates, having
mainly used C++ for quite a while as 'C with Classes', but
now I have an application which seems to cry out for
templates, but I just can't get my head around how to use
them in this situation. Any assistance or pointers to other
resources would be welcomed.
Let's say I have a (third party, unmodifiable) library of C
functions which provide the following interfaces:
int AAA_setup(const uint8_t* p1, int p2, struct context* p3);
int AAA_process(const uint8_t* p1, uint8_t* p2, struct context* p3);
int AAA_done(struct context* p1);
int BBB_setup(const uint8_t* p1, int p2, struct context* p3);
int BBB_process(const uint8_t* p1, uint8_t* p2, struct context* p3);
int BBB_done(struct context* p1);
int CCC_setup(const uint8_t* p1, int p2, struct context* p3);
int CCC_process(const uint8_t* p1, uint8_t* p2, struct context* p3);
int CCC_done(struct context* p1);
What I want to do is provide a class wrapper for all this
so that in my C++ application I can do something like:
Work<BBB> thing;
thing.setup(&data1, val);
thing.process(&in, &out);
thing.done();
(The pointer to the context structure can obviously disappear as
private data within the class)
Now this seems from my reading to be the sort of thing
that templates are probably good at, but I can't for the
life of me see how to do it, without first creating a
separate class for each of AAA, BBB, and CCC.
Can anyone enlighten me please?
Each of group AAA, BBB and CCC essentially constitute a functor object.=
class AbstractWork
{
public:
virtual ~AbstractWork() {}
virtual int operator( whatever ) = 0;
};
You've lost me there. Each group proposes three functions, not
one.
Each group essentially consists of initialization, do-it, and
destructor, and that's a functor.
Aha. I didn't actually look at the names of the functions; I
just saw three functions. I tend to think of functors as not
having much state, but I guess there are exceptions. And of
course, if you have a pointer to the base class, you have to
dereference it to call the function, e.g. (*p)( whatever ). In
such cases, I tend to use named functions, but again, it would
probably depend on the case. If you can't find a name better
than process(), then operator()() is probably the way to go.
And you're certainly right that a function called setup()
belongs in a constructor, and a function called done() in a
destructor.
(And you never use AbstractWork later, either. Is it
maybe part of an idea you had to start with, that didn't pan
out, and you forgot to delete it?)
It's a means to be able to treat the functors polymorphically.
I think that's what confused me the most. You never derive from
it. (Or use it in any other way.) And I failed to make the
connection with the templated functor (which you obviously meant
to derive, since you just said you wanted to treat it
polymorphically).
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34