explicit instantiation of template methods of template classes

T

Thomas Maier-Komor

Hi everybody,

I am a little bit confused with the syntax of explicit instantiation,
and I am not sure that it is possible to do what I want to do.
Maybe someone has an idea.

Consider a template class:

template <class ABC>
struct CT : public ABC
{
template<typename T>
void a(T const &)
{
// something
}

// the next line is not enough for what I want, but probably needed
using ABC::a;
};


//... and an abstract base class:

struct ABC
{
virtual void a(int const &) = 0;
};

//... and a usage:

struct MyClass : public CT<ABC>
{

};


now CT<>::a hides ABC::a. But I would like to instantiate CT::a
so that it does not hide ABC::a, but implement the virtual
function ABC::a for MyClass.

Is this possible? what do I have to write into MyClass?
Any idea?


Tom
 
K

Kai-Uwe Bux

Thomas said:
Hi everybody,

I am a little bit confused with the syntax of explicit instantiation,
and I am not sure that it is possible to do what I want to do.
Maybe someone has an idea.

Consider a template class:

template <class ABC>
struct CT : public ABC
{
template<typename T>
void a(T const &)
{
// something
}

// the next line is not enough for what I want, but probably needed
using ABC::a;
};

Why is this needed?
//... and an abstract base class:

struct ABC
{
virtual void a(int const &) = 0;
};

//... and a usage:

struct MyClass : public CT<ABC>
{

};


now CT<>::a hides ABC::a. But I would like to instantiate CT::a
so that it does not hide ABC::a, but implement the virtual
function ABC::a for MyClass.

Is this possible? what do I have to write into MyClass?
Any idea?


Tom

I am not sure whether this is legal, but on my machine it appears to do the
intended:



#include <iostream>

struct A {

virtual void a ( void ) = 0;

virtual ~A ( void ) {}

};

template < typename T >
struct B : public T {

void a ( void ) {
std::cout << "hello world!\n";
}

~B ( void ) {}

};

struct C : public B<A> {

void a ( void ) {
std::cout << "don't say hello!\n";
}

~C ( void ) {}

};

struct D : public B<A> {

~D ( void ) {}

};


int main ( void ) {
A * a_ptr = new C;
a_ptr->a();
A * a2_ptr = new D;
a2_ptr->a();
}



Best

Kai-Uwe Bux
 
T

Thomas Maier-Komor

Kai-Uwe Bux said:
Thomas Maier-Komor wrote:




Why is this needed?




I am not sure whether this is legal, but on my machine it appears to do the
intended:



#include <iostream>

struct A {

virtual void a ( void ) = 0;

virtual ~A ( void ) {}

};

template < typename T >
struct B : public T {

void a ( void ) {
std::cout << "hello world!\n";
}

~B ( void ) {}

};

struct C : public B<A> {

void a ( void ) {
std::cout << "don't say hello!\n";
}

~C ( void ) {}

};

struct D : public B<A> {

~D ( void ) {}

};


int main ( void ) {
A * a_ptr = new C;
a_ptr->a();
A * a2_ptr = new D;
a2_ptr->a();
}



Best

Kai-Uwe Bux


OK that's obvious, but this does not employ my
template method, which should implement the pure
virtual method automagically. And _that_ is my
primary intention...

Tom
 
K

Kai-Uwe Bux

Thomas said:
OK that's obvious, but this does not employ my
template method, which should implement the pure
virtual method automagically. And _that_ is my
primary intention...

Clearly, I just do not understand what you are trying to accomplish. How is
the pure virtual method A::a not automatigically implemented in the class D
from my example? A::a clearly is implemented in D, and it is implemented
via inheriting from the template B<A>.


Sorry for not being helpful

Kai-Uwe Bux
 
T

Thomas Maier-Komor

Kai-Uwe Bux said:
Clearly, I just do not understand what you are trying to accomplish. How is
the pure virtual method A::a not automatigically implemented in the class D
from my example? A::a clearly is implemented in D, and it is implemented
via inheriting from the template B<A>.


Sorry for not being helpful

Kai-Uwe Bux

What I am trying to accomplish is the following:
In an implementation of the visitor pattern with several visitors,
I want an entry for each kind of Visitor to be implemented
automatically, so that a call to object->runVisitor(visitor)
is single dispatching (via object's base class) instead of double
dispatching (via object's and visitor's base classes). This
can be done coding manually, but I wanted the added functionallity
that I have a template class which can be configured to create
the necessary methods for different visitors.

I hope you understand what I mean...

Tom
 
K

Kai-Uwe Bux

Thomas said:
What I am trying to accomplish is the following:
In an implementation of the visitor pattern with several visitors,
I want an entry for each kind of Visitor to be implemented
automatically, so that a call to object->runVisitor(visitor)
is single dispatching (via object's base class) instead of double
dispatching (via object's and visitor's base classes). This
can be done coding manually, but I wanted the added functionallity
that I have a template class which can be configured to create
the necessary methods for different visitors.

I hope you understand what I mean...

Tom

Thanks for the explanation. Now I see more clearly what you want.
Unfortunately, I do not know how to do that. Did you look into:

Andrei Alexancrescu: Modern C++ Design

Chapter 10 is on the visitor pattern.


Best

Kai-Uwe Bux
 
T

Thomas Maier-Komor

Kai-Uwe Bux said:
Thanks for the explanation. Now I see more clearly what you want.
Unfortunately, I do not know how to do that. Did you look into:

Andrei Alexancrescu: Modern C++ Design

Chapter 10 is on the visitor pattern.


Best

Kai-Uwe Bux

I will have a look - thanks for the pointer.

Tom
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,023
Latest member
websitedesig25

Latest Threads

Top