explicit instantiation of template methods of template classes

Discussion in 'C++' started by Thomas Maier-Komor, May 17, 2005.

  1. 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
    Thomas Maier-Komor, May 17, 2005
    #1
    1. Advertising

  2. Thomas Maier-Komor

    Kai-Uwe Bux Guest

    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
    Kai-Uwe Bux, May 17, 2005
    #2
    1. Advertising

  3. 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
    Thomas Maier-Komor, May 17, 2005
    #3
  4. Thomas Maier-Komor

    Kai-Uwe Bux Guest

    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
    Kai-Uwe Bux, May 17, 2005
    #4
  5. 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
    Thomas Maier-Komor, May 17, 2005
    #5
  6. Thomas Maier-Komor

    Kai-Uwe Bux Guest

    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
    Kai-Uwe Bux, May 18, 2005
    #6
  7. 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
    Thomas Maier-Komor, May 19, 2005
    #7
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. C. Carbonera
    Replies:
    4
    Views:
    1,334
    C. Carbonera
    Feb 5, 2004
  2. Fernando Cuenca
    Replies:
    4
    Views:
    2,515
    Gianni Mariani
    Sep 6, 2004
  3. Replies:
    1
    Views:
    562
    Salt_Peter
    Dec 25, 2006
  4. Replies:
    2
    Views:
    437
  5. Noah Roberts
    Replies:
    6
    Views:
    1,136
    Johannes Schaub (litb)
    Feb 2, 2011
Loading...

Share This Page