Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Use static type from template pointer type
Qt 6.11 is out! See what's new in the release blog

Use static type from template pointer type

Scheduled Pinned Locked Moved C++ Gurus
10 Posts 3 Posters 5.1k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Max13
    wrote on last edited by
    #1

    Hi,

    Le title isn't really clear, but I didn't know how to write it, sorry if it's also a duplicate.

    I'm subclassing QAbstractListModel as a template class named AbstractListModel which contains an internal QList (of pointer types). Obviously, my subclass is a template to define the QList content, but I also use it with QVariants.

    I want the AbstractListModel subclasses to inherit from *AbstractListModel<MyClass > (which will set the QList content to <MyClass *> also) BUT I'm using the full type (not the pointer, the static type) to convert from QVariant, my problem is that I don't know how to write the full template type from the pointer one.

    Example:
    @template <typename T = int *>
    void test()
    {
    T a = 0; // Here, a is a pointer to int.
    ??????? // And here I want to declare an int
    }@

    Is there a way to declare a static type if you know that T is a pointer type?

    We all have started by asking questions. Then after some time, we can begin answering them.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      andreyc
      wrote on last edited by
      #2

      Yes, there is a way in c++ 11, but I don't think it is very useful.
      @
      template <typename T = int *>
      void test()
      {
      T a = 0; // Here, a is a pointer to int.
      auto b = *a; // And here I want to declare an int
      std::cout << b << std::endl; // core dump is here :-)
      }
      @

      PS: Why not inverse it.
      @
      template <typename T = int>
      void test()
      {
      T a = 0;
      T* b = new T;
      std::cout << b << std::endl; // core dump is here :-)
      }
      @

      1 Reply Last reply
      0
      • M Offline
        M Offline
        Max13
        wrote on last edited by
        #3

        This is just an example. The type will never be an int but a class, and there will be no default type.

        I wrote it that way only as a comprehensible example, so inversion is excluded (as the question is how to write the static type from the pointer type), as well as auto ;)

        Thanks anyway

        We all have started by asking questions. Then after some time, we can begin answering them.

        1 Reply Last reply
        0
        • A Offline
          A Offline
          andreyc
          wrote on last edited by
          #4

          Thank you for interesting question.
          BTW why auto is excluded ?

          I have another example. But it uses auto
          @
          /** http://www.cplusplus.com/reference/memory/pointer_traits/

          • g++ -std=c++11 -o test2 test2.cpp
            */
            // pointer_traits example
            #include <iostream>
            #include <memory>

          // using pointer_traits to determine return type:
          template <class T>
          typename std::pointer_traits<T>::element_type dereference_pointer (T pt) {
          return *pt;
          }

          class A
          {
          public:
          A() : m_number(0) {}
          ~A() {}

              void setNumber(int number) {
                  m_number = number;
              }
              int number() const {
                  return m_number;
              }
          
          private:
              int m_number;
          

          };

          class B
          {
          public:
          B() {}
          ~B() {}
          };

          int main(int, char**)
          {
          int* foo = new int(1);
          std::shared_ptr<int> bar (new int(2));

          std::cout << "foo: " << dereference_pointer (foo) << '\n';
          std::cout << "bar: " << dereference_pointer (bar) << '\n';
          
          delete foo;
          
          A* pa = new A;
          pa->setNumber(23);
          
          auto a = dereference_pointer(pa);
          a.setNumber(34);
          
          std::cout << "pa = " << pa->number() << std::endl;
          std::cout << "a = " << a.number() << std::endl;
          
          B* pb = new B;
          auto b = dereference_pointer(pb);
          b.setNumber(34);
          
          return 0;
          

          }
          @

          1 Reply Last reply
          0
          • M Offline
            M Offline
            Max13
            wrote on last edited by
            #5

            [quote author="andreyc" date="1401232860"]BTW why auto is excluded ?
            [/quote]
            I wrongly thought auto was used to declare ints. So it's not excluded, my mistake.

            But as I'm reading your post, I think it's still now what I'm asking as I don't think using the value is useful, maybe my question isn't clear.

            Let's imagine I have this class:
            @template <typename T>
            class A
            {
            T m_dummy;
            }@

            Here, if I instantiate A with T = QWidget * (this is an example), m_dummy will be a pointer to QWidget.

            If I instantiate A with T = QWidget, m_dummy will be of type QWidget (the plain type, not a pointer).

            Now, my question is: How to write A to be able to instantiate it with T = QWidget * and to have m_dummy to be of type QWidget (the plain type, not the pointer, as is T) ?

            Hope it's clearer.

            We all have started by asking questions. Then after some time, we can begin answering them.

            1 Reply Last reply
            0
            • A Offline
              A Offline
              andreyc
              wrote on last edited by
              #6

              Are you sure that you need to declare a variable. Maybe you can use some getter function that will return type auto and compiler will deduce the type.
              Could you post an example that reflects your design.

              1 Reply Last reply
              0
              • M Offline
                M Offline
                Max13
                wrote on last edited by
                #7

                [quote author="andreyc" date="1401243568"]Could you post an example that reflects your design.[/quote]

                What I previously wrote was part of what I need.

                @template <typename T>
                class A
                {
                private:
                QList<T> m_list;
                T m_tmp;
                }@

                Here, if I instantiate A with T = QWidget *, how to write m_tmp to be the plain type and not the pointer?

                I wonder how to do it, today I have a solution: Instantiate A with plain type and QList<T>*, but I didn't know how to write it if T = pointer.

                We all have started by asking questions. Then after some time, we can begin answering them.

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  andreyc
                  wrote on last edited by
                  #8

                  [quote author="Max13" date="1401266922"]I wonder how to do it, today I have a solution: Instantiate A with plain type and QList<T>*, [/quote]
                  That I was trying to say when I talking about "inverse it" :-)
                  [quote author="Max13" date="1401266922"]but I didn't know how to write it if T = pointer.[/quote]I don't know it either. That is why I asked about getter function. With a function you can pass a pointer to a variable and a compiler can deduce the type using
                  @
                  template <class T>
                  typename std::pointer_traits<T>::element_type dereference_pointer (T pt) {
                  return *pt;
                  }
                  @

                  Anyway, I'm glad that you've resolved the issue.

                  Could you please prepend "[SOLVED]" to the title of your post. So the other good people will be able to find your solution.

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    Max13
                    wrote on last edited by
                    #9

                    [quote author="andreyc" date="1401268410"]Could you please prepend "[SOLVED]" to the title of your post.[/quote]

                    Actually it's not solved ^^'
                    My own problem is solved, but not "How to write it" :/

                    We all have started by asking questions. Then after some time, we can begin answering them.

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      bipll
                      wrote on last edited by
                      #10

                      g++ 4.7.2 compiles it with -std=c++98, got no real idea whether it is in accordance with any standard:
                      @#include <iostream>

                      template<class T> struct Deref {
                      typedef T Refed;
                      };

                      template<typename T> struct Deref<T *> {
                      typedef T Refed;
                      };

                      template<typename T> void omg(T t) {
                      typename Deref<T>::Refed defer(0);
                      std::cout << defer << std::endl;
                      }

                      int main() {
                      omg((int *)NULL);
                      }@

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved