Boost logo

Ublas :

From: Thomas Lemaire (thomas.lemaire_at_[hidden])
Date: 2005-10-07 02:46:36

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
> 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

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 !!