Is it possible to use type traits as a template parameter?

Discussion in 'C++' started by Raider, May 12, 2006.

  1. Raider

    Raider Guest

    I'm trying to create a base class who will contain generic algoritms
    and derived class(es) who will perform problem-specific things. I'm
    unable to use dynamic polymorphism, because base class know nothing
    about problem-specific types. I wrote the following code using static
    polymorphism, but compiler do not allow me to use type traits as a
    template parameter, the following code not compiles:

    template <class CT>
    struct InfoClass
    {
    int id;
    CT content;
    };

    template <class T, class TTraits>
    struct SomeImpl
    {
    void go()
    {
    T *pT = static_cast<T*>(this);
    pT->go_implementation();
    }

    void set_pointer(TTraits::ptrtype newptr)
    {
    ptr = newptr;
    }

    typedef InfoClass<TTraits::basetype> obj_type;
    std::vector<obj_type> v;

    TTraits::ptrtype ptr;
    };

    struct SomeClassTraits
    {
    typedef int basetype;
    typedef char* ptrtype;
    };

    struct SomeClass : public SomeImpl<SomeClass, SomeClassTraits>
    {
    void go_implementation()
    {
    cout << "SomeClass.go()" << endl;

    // use ptr as a char*
    // use v as a vector<InfoClass<int> >
    }
    };

    void TestTemplateImpl()
    {
    SomeClass x;
    x.go();
    }


    Of course I can expand this
    template <class T, class TTraits> struct SomeImpl
    to the
    template <class T, typename basetype, typename ptrtype, ...> struct
    SomeImpl
    but it will be a problem to maintain large code, for example:

    // SomeImpl.h
    template <class T, class TTraits>
    struct SomeImpl
    {
    void go();
    void set_pointer(TTraits::ptrtype newptr);
    // a lot of member functions...
    };
    #include "SomeImpl.inl"

    // SomeImpl.inl
    template <class T, class TTraits>
    inline void SomeImpl::go()
    {
    // implementation of go()
    }

    template <class T, class TTraits>
    inline void SomeImpl::set_pointer(TTraits::ptrtype newptr);
    {
    // implementation of go()
    }

    If list of types changes, I need to rewrite "template<>" header for
    each member function :-(

    Are there any possibilities to pass type traits to template as a single
    argument?
    Raider, May 12, 2006
    #1
    1. Advertising

  2. Raider

    mlimber Guest

    Raider wrote:
    > I'm trying to create a base class who will contain generic algoritms
    > and derived class(es) who will perform problem-specific things. I'm
    > unable to use dynamic polymorphism, because base class know nothing
    > about problem-specific types. I wrote the following code using static
    > polymorphism, but compiler do not allow me to use type traits as a
    > template parameter, the following code not compiles:


    Why doesn't it compile? What error messages did you get and where?

    >
    > template <class CT>
    > struct InfoClass
    > {
    > int id;
    > CT content;
    > };
    >
    > template <class T, class TTraits>
    > struct SomeImpl
    > {
    > void go()
    > {
    > T *pT = static_cast<T*>(this);
    > pT->go_implementation();
    > }
    >
    > void set_pointer(TTraits::ptrtype newptr)

    [snip rest of code]

    You need "typename" before that type and all others within TTraits.

    Cheers! --M
    mlimber, May 12, 2006
    #2
    1. Advertising

  3. Raider wrote:
    > I'm trying to create a base class who will contain generic algoritms
    > and derived class(es) who will perform problem-specific things. I'm
    > unable to use dynamic polymorphism, because base class know nothing
    > about problem-specific types. I wrote the following code using static
    > polymorphism, but compiler do not allow me to use type traits as a
    > template parameter, the following code not compiles:


    Of course it doesn't. It's missing some vital portions:

    #include <vector>
    #include <iostream>

    >
    > template <class CT>
    > struct InfoClass
    > {
    > int id;
    > CT content;
    > };
    >
    > template <class T, class TTraits>
    > struct SomeImpl
    > {
    > void go()
    > {
    > T *pT = static_cast<T*>(this);
    > pT->go_implementation();
    > }
    >
    > void set_pointer(TTraits::ptrtype newptr)


    void set_pointer(typename TTraits::ptrtype newptr)

    > {
    > ptr = newptr;
    > }
    >
    > typedef InfoClass<TTraits::basetype> obj_type;


    typedef InfoClass<typename TTraits::basetype> obj_type;

    > std::vector<obj_type> v;
    >
    > TTraits::ptrtype ptr;


    typename TTraits::ptrtype ptr;

    > };
    >
    > struct SomeClassTraits
    > {
    > typedef int basetype;
    > typedef char* ptrtype;
    > };
    >
    > struct SomeClass : public SomeImpl<SomeClass, SomeClassTraits>
    > {
    > void go_implementation()
    > {
    > cout << "SomeClass.go()" << endl;


    std::cout << "SomeClass.go()" << std::endl;

    >
    > // use ptr as a char*
    > // use v as a vector<InfoClass<int> >
    > }
    > };
    >
    > void TestTemplateImpl()
    > {
    > SomeClass x;
    > x.go();
    > }
    >
    >
    > [...]
    >
    > Are there any possibilities to pass type traits to template as a
    > single argument?


    I think you need to learn about "dependent names".

    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
    Victor Bazarov, May 12, 2006
    #3
  4. Raider

    Raider Guest

    > You need "typename" before that type and all others within TTraits.

    Oh, really!!! I forgot about "typename" keyword...
    Thank you for quick answer.
    Raider, May 12, 2006
    #4
    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. Diego Martins
    Replies:
    5
    Views:
    483
    Diego Martins
    Sep 5, 2006
  2. Hong Ye
    Replies:
    5
    Views:
    370
    Naresh Rautela
    Jun 2, 2007
  3. Stuart Redmann
    Replies:
    5
    Views:
    476
    Stuart Redmann
    Dec 14, 2007
  4. ray
    Replies:
    1
    Views:
    1,313
    Robert Kern
    Jun 4, 2010
  5. Qi
    Replies:
    1
    Views:
    391
Loading...

Share This Page