Boost logo

Ublas :

From: Thomas Lemaire (thomas.lemaire_at_[hidden])
Date: 2005-10-07 07:34:48


Hi,

I do not really understand how this can solve my problem, I could multiply the
virtual methods for each input datatype, but this would be a pain to
implement in derivate classes ! (and there is no need for a template method
here...)

thomas

On Friday 07 October 2005 14:16, Vardan Akopian wrote:
> Hi Thomas,
>
> If you know exactly which types you will be using, then you can simply
> forward the virtual functions to a template version:
>
> class Foo {
> virtual void doSomeThing(vector<double> const& v1, vector<double> & v2)
> {
> doSomeThing_tmpl(v1, v2);
> }
>
> virtual void doSomeThing(vector_range<vector<double> > const& v1,
> vector_range<vector<double> > & v2)
> {
> doSomeThing_tmpl(v1, v2);
> }
>
> private:
> template<class Vec1, class Vec2>
> void doSomeThing_tmpl(Vec1 const& v1, Vec2 & v2);
> };
>
> This is not very elegant, but at least you don't need to do
> subrange's, and it's trivial to add more types when needed.
>
> Hope this helps.
>
> -Vardan
>
> On 10/7/05, Thomas Lemaire <thomas.lemaire_at_[hidden]> wrote:
> > On Friday 07 October 2005 01:02, Paul C. Leopardi wrote:
> > > Could you please elaborate? If your method is virtual, why can it not
> > > be template? In what way is it different from the virtual template
> > > member functions which are used in the template class
> > > glucat::clifford_algebra in GluCat, for example? See
> > > http://sourceforge.net/projects/glucat/ These functions are inherited
> > > at compile time by the template classes glucat::matrix_multi and
> > > glucat::framed_multi, using a variant of the Barton-Nackman trick,
> > > otherwise known as Curiously Recurring Templates.
> >
> > My method cannot be template because the compiler complains about it. It
> > is a matter of virtual table which would be undefined (I am not 100% sure
> > of what I am saying...). In your case, the whole class is template.
> >
> > > This part of the Wiki talks about runtime polymorphism. The template
> > > class glucat::clifford_algebra uses compile time polymorphism. Do you
> > > need runtime polymorphism or could you do what you want using only
> > > compile time polymorphism?
> >
> > Yes, I need need runtime polymorphism, that's the point...
> >
> > I would like to achieve something like this:
> >
> > class Foo {
> > /* ... */
> >
> > template<class Vec1, class Vec2>
> > virtual void doSomeThing(Vec1 const& v1, Vec2 & v2);
> >
> > // and also with virtual pure method
> >
> > /* ... */
> > };
> >
> > Actually I am only using vector<double> and vector_range< vector<double>
> > >, so I could manage things using intermediate functions and
> > project/subrange like this:
> >
> > class Foo {
> > /* ... */
> >
> > void doSomeThing(vec const& v1, vec & v2) {
> > doSomething(subrange(v1,0,v1.size()), subrange(v2,0,v2.size()));
> > };
> >
> > void doSomeThing(vec_range const& v1, vec & v2) {
> > doSomething(v1, subrange(v2,0,v2.size()));
> > };
> >
> > void doSomeThing(vec const& v1, vec_range & v2) {
> > doSomething(subrange(v1,0,v1.size()), v2);
> > };
> >
> > virtual void doSomeThing(vec_range const& v1, vec_range & v2);
> >
> > /* ... */
> > };
> >
> > Sometimes I have 3 vector-arguments for doSomeThing(), it is really a
> > pain,,, And I also sometime use fixed size vector !!
> >
> > cheers,
> > --
> > thomas
> > _______________________________________________
> > ublas mailing list
> > ublas_at_[hidden]
> > http://lists.boost.org/mailman/listinfo.cgi/ublas
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/ublas

-- 
thomas