How to get template parameter, when i match a template?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • abir

    How to get template parameter, when i match a template?

    I am matching a template, and specializing based of a template, rather
    than a single class.

    The codes are like,
    template<templa te<typename T,typename Alloc = std::allocator< T>
    >class C>
    class pix{
    };

    template<>
    class pix<vector>{
    };
    The matching works perfectly.
    Now how will i get the template parameters in the specialized class?
    I want to do things like,
    template<>
    class pix<std::vector >{
    private:
    std::vector<T>* v_;
    };
    From where will I get T & Alloc fro which it is a match?

    Thanks
    abir
  • Kai-Uwe Bux

    #2
    Re: How to get template parameter, when i match a template?

    abir wrote:
    I am matching a template, and specializing based of a template, rather
    than a single class.
    >
    The codes are like,
    template<templa te<typename T,typename Alloc = std::allocator< T>
    >>class C>
    class pix{
    };
    >
    template<>
    class pix<vector>{
    };
    The matching works perfectly.
    Now how will i get the template parameters in the specialized class?
    I want to do things like,
    template<>
    class pix<std::vector >{
    private:
    std::vector<T>* v_;
    };
    Why a pointer to a vector. That looks fishy.
    From where will I get T & Alloc fro which it is a match?
    You won't get them from anywhere. You have to supply them.

    BTW: this is not related to the class being specialized. If you consider the
    unspecialized pix, you will find that you cannot get at T and Alloc either
    because they are just placeholders for something you still need to specify.


    Best

    Kai-Uwe Bux

    Comment

    • abir

      #3
      Re: How to get template parameter, when i match a template?

      On Jun 30, 4:52 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
      abir wrote:
      I am matching a template, and specializing based of a template, rather
      than a single class.
      >
      The codes are like,
      template<templa te<typename T,typename Alloc = std::allocator< T>
      >class C>
      class pix{
      };
      >
      template<>
      class pix<vector>{
      };
      The matching works perfectly.
      Now how will i get the template parameters in the specialized class?
      I want to do things like,
      template<>
      class pix<std::vector >{
      private:
      std::vector<T>* v_;
      };
      >
      Why a pointer to a vector. That looks fishy.
      >
      From where will I get T & Alloc fro which it is a match?
      >
      You won't get them from anywhere. You have to supply them.
      >
      BTW: this is not related to the class being specialized. If you consider the
      unspecialized pix, you will find that you cannot get at T and Alloc either
      because they are just placeholders for something you still need to specify.
      >
      Best
      >
      Kai-Uwe Bux
      It can be reference to a vector instead of pointer. I want to have an
      external iterator kind of thing, which i name pix, which is portable,
      i.e can be stored as long as the element at the location exists,
      irrespective of whether container resizes or not. (Of course they can
      be made immune to pop_front,push_ front, insert, erase etc also)
      The pointer to a vector is not at all fishy in this case, almost all
      (not all) iterators has a pointer to the container.
      I want something like,
      typedef vector<int V;
      V v; v.push_back() a few elements ...
      pix<Vp(v);
      ++p; *p; get element
      v.push_back() a few more.
      *p to get element.

      so for a container C , i wanted pix as,
      template<typena me C>
      class pix{
      C& c_;
      C::size_type index_;
      };
      when C is a vector, but another implementation for another C. Only
      problem is C itself is a template.

      Why the template template parameters are "just placeholders" when the
      instance is a full class?
      Any other way to do it?

      Thanks
      abir

      Comment

      • Kai-Uwe Bux

        #4
        Re: How to get template parameter, when i match a template?

        abir wrote:
        On Jun 30, 4:52 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
        >abir wrote:
        I am matching a template, and specializing based of a template, rather
        than a single class.
        >>
        The codes are like,
        template<templa te<typename T,typename Alloc = std::allocator< T>
        >>class C>
        class pix{
        };
        >>
        template<>
        class pix<vector>{
        };
        The matching works perfectly.
        Now how will i get the template parameters in the specialized class?
        I want to do things like,
        template<>
        class pix<std::vector >{
        private:
        std::vector<T>* v_;
        };
        >>
        >Why a pointer to a vector. That looks fishy.
        >>
        From where will I get T & Alloc fro which it is a match?
        >>
        >You won't get them from anywhere. You have to supply them.
        >>
        >BTW: this is not related to the class being specialized. If you consider
        >the unspecialized pix, you will find that you cannot get at T and Alloc
        >either because they are just placeholders for something you still need to
        >specify.
        >>
        >Best
        >>
        >Kai-Uwe Bux
        >
        It can be reference to a vector instead of pointer. I want to have an
        external iterator kind of thing, which i name pix, which is portable,
        i.e can be stored as long as the element at the location exists,
        irrespective of whether container resizes or not. (Of course they can
        be made immune to pop_front,push_ front, insert, erase etc also)
        The pointer to a vector is not at all fishy in this case, almost all
        (not all) iterators has a pointer to the container.
        I want something like,
        typedef vector<int V;
        V v; v.push_back() a few elements ...
        pix<Vp(v);
        ++p; *p; get element
        v.push_back() a few more.
        *p to get element.
        >
        so for a container C , i wanted pix as,
        template<typena me C>
        class pix{
        C& c_;
        C::size_type index_;
        };
        when C is a vector, but another implementation for another C. Only
        problem is C itself is a template.
        I see. In this case, I think, you want a pointer and not a reference. That
        way, you won't run into trouble implementing an assignment operator for
        pix.

        Why the template template parameters are "just placeholders" when the
        instance is a full class?
        This is too vague. The instance of what is a class?

        Anyway, when you have a template template parameter, what you pass as a
        parameter is a template. In you case, you pass std::vector. Note that you
        do not pass an instantiation of that template, i.e., you do not pass
        something like std::vector<int >. You just pass std::vector. The pix class
        would be able to use the parameter C to do stuff like C<int>.
        Any other way to do it?
        You don't want to use template template parameters. Use an ordinary typename
        parameter:

        template < typename Sequence >
        class pix;

        and then specialize for vectors:

        template < typename T, typename A >
        class pix< std::vector< T, A {
        ...
        };

        for deques:

        template < typename T, typename A >
        class pix< std::deque< T, A {
        ...
        };

        and for lists:

        template < typename T, typename A >
        class pix< std::list< T, A {
        ...
        };

        (not run by a compiler)


        Best

        Kai-Uwe Bux

        Comment

        • abir

          #5
          Re: How to get template parameter, when i match a template?

          On Jun 30, 5:31 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
          abir wrote:
          On Jun 30, 4:52 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
          abir wrote:
          I am matching a template, and specializing based of a template, rather
          than a single class.
          >
          The codes are like,
          template<templa te<typename T,typename Alloc = std::allocator< T>
          >class C>
          class pix{
          };
          >
          template<>
          class pix<vector>{
          };
          The matching works perfectly.
          Now how will i get the template parameters in the specialized class?
          I want to do things like,
          template<>
          class pix<std::vector >{
          private:
          std::vector<T>* v_;
          };
          >
          Why a pointer to a vector. That looks fishy.
          >
          From where will I get T & Alloc fro which it is a match?
          >
          You won't get them from anywhere. You have to supply them.
          >
          BTW: this is not related to the class being specialized. If you consider
          the unspecialized pix, you will find that you cannot get at T and Alloc
          either because they are just placeholders for something you still need to
          specify.
          >
          Best
          >
          Kai-Uwe Bux
          >
          It can be reference to a vector instead of pointer. I want to have an
          external iterator kind of thing, which i name pix, which is portable,
          i.e can be stored as long as the element at the location exists,
          irrespective of whether container resizes or not. (Of course they can
          be made immune to pop_front,push_ front, insert, erase etc also)
          The pointer to a vector is not at all fishy in this case, almost all
          (not all) iterators has a pointer to the container.
          I want something like,
          typedef vector<int V;
          V v; v.push_back() a few elements ...
          pix<Vp(v);
          ++p; *p; get element
          v.push_back() a few more.
          *p to get element.
          >
          so for a container C , i wanted pix as,
          template<typena me C>
          class pix{
          C& c_;
          C::size_type index_;
          };
          when C is a vector, but another implementation for another C. Only
          problem is C itself is a template.
          >
          I see. In this case, I think, you want a pointer and not a reference. That
          way, you won't run into trouble implementing an assignment operator for
          pix.
          >
          Yes, that is the only reason I had to use pointer instead of
          reference.
          Why the template template parameters are "just placeholders" when the
          instance is a full class?
          >
          This is too vague. The instance of what is a class?
          >
          Anyway, when you have a template template parameter, what you pass as a
          parameter is a template. In you case, you pass std::vector. Note that you
          do not pass an instantiation of that template, i.e., you do not pass
          something like std::vector<int >. You just pass std::vector. The pix class
          would be able to use the parameter C to do stuff like C<int>.
          >
          Any other way to do it?
          >
          You don't want to use template template parameters. Use an ordinary typename
          parameter:
          >
          template < typename Sequence >
          class pix;
          >
          and then specialize for vectors:
          >
          template < typename T, typename A >
          class pix< std::vector< T, A {
          ...
          };
          >
          for deques:
          >
          template < typename T, typename A >
          class pix< std::deque< T, A {
          ...
          };
          >
          and for lists:
          >
          template < typename T, typename A >
          class pix< std::list< T, A {
          ...
          };
          >
          (not run by a compiler)
          >
          Got it. It runs perfectly & works according to my wishes!
          Thanks a lot.
          BTW, is there any already existing code which can refer to a slice of
          sequence which doesn't get invalidated due to memory capacity related
          issues? (I know blitz array boost numerics etc have slicing , but the
          containers are non re sizable there ). I am very much in need for
          that.
          Best
          >
          Kai-Uwe Bux
          abir

          Comment

          Working...