Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   explicit instantiation of template methods of template classes (http://www.velocityreviews.com/forums/t291105-explicit-instantiation-of-template-methods-of-template-classes.html)

Thomas Maier-Komor 05-17-2005 11:45 AM

explicit instantiation of template methods of template classes
 
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

Kai-Uwe Bux 05-17-2005 12:33 PM

Re: explicit instantiation of template methods of template classes
 
Thomas Maier-Komor wrote:

> 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

Thomas Maier-Komor 05-17-2005 01:42 PM

Re: explicit instantiation of template methods of template classes
 
Kai-Uwe Bux wrote:
> Thomas Maier-Komor wrote:
>
>
>>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



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

Kai-Uwe Bux 05-17-2005 02:39 PM

Re: explicit instantiation of template methods of template classes
 
Thomas Maier-Komor wrote:

> Kai-Uwe Bux wrote:
>> Thomas Maier-Komor wrote:
>>
>>
>>>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

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

Thomas Maier-Komor 05-17-2005 03:32 PM

Re: explicit instantiation of template methods of template classes
 
Kai-Uwe Bux wrote:
>
>
> 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

Kai-Uwe Bux 05-18-2005 12:06 PM

Re: explicit instantiation of template methods of template classes
 
Thomas Maier-Komor wrote:

> Kai-Uwe Bux wrote:
>>
>>
>> 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


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

Thomas Maier-Komor 05-19-2005 08:00 AM

Re: explicit instantiation of template methods of template classes
 
Kai-Uwe Bux wrote:
>
>
> 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


All times are GMT. The time now is 10:41 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.