Ambiguous member function pointer

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

    #1

    Ambiguous member function pointer

    I have a class that has two member functions of the same name:

    class MyClass {
    public:
    void someFunction(in t arg);
    void someFunction(in t arg, char blah);
    };

    I'm trying to get a tr1::functional to the first one, for example:

    std::tr1::funct ion<void (MyClass*, int)func_obj;
    func_obj = &Myclass::someF unction;

    But compilation fails on the second line, since MyClass::someFu nction
    is ambiguous.

    The only way around it I've found is to first create a member function
    pointer, then pass that to the constructor of the function object.

    I'm curious if there's a better way to do it, or if I'm stuck with
    using function pointers as intermediates? I'm using linux gcc 4.1.

    Thanks,
    Caleb

  • Victor Bazarov

    #2
    Re: Ambiguous member function pointer

    Caleb wrote:
    I have a class that has two member functions of the same name:
    >
    class MyClass {
    public:
    void someFunction(in t arg);
    void someFunction(in t arg, char blah);
    };
    >
    I'm trying to get a tr1::functional to the first one, for example:
    >
    std::tr1::funct ion<void (MyClass*, int)func_obj;
    func_obj = &Myclass::someF unction;
    >
    But compilation fails on the second line, since MyClass::someFu nction
    is ambiguous.
    >
    The only way around it I've found is to first create a member function
    pointer, then pass that to the constructor of the function object.
    >
    I'm curious if there's a better way to do it, or if I'm stuck with
    using function pointers as intermediates? I'm using linux gcc 4.1.
    I am not very proficient with TR1 yet, so educate me, if you will.
    Does the use of 'std::tr1::func tion' suddenly allow conversion between
    a pointer-to-member and a pointer-to-function (disallowed by the C++
    language proper definition)?

    void (MyClass::*)(in t)

    and

    void (*)(MyClass*, int)

    are not the same type. Does 'std::tr1::func tion' somehow overcome
    the problem of those types' incompatibility ?

    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask


    Comment

    • Pete Becker

      #3
      Re: Ambiguous member function pointer

      Caleb wrote:
      I have a class that has two member functions of the same name:
      >
      class MyClass {
      public:
      void someFunction(in t arg);
      void someFunction(in t arg, char blah);
      };
      >
      I'm trying to get a tr1::functional to the first one, for example:
      >
      std::tr1::funct ion<void (MyClass*, int)func_obj;
      func_obj = &Myclass::someF unction;
      typedef void (MyClass::*fptr )(int);

      func_obj = (fptr)&MyClass: :someFunction;

      You can also do it without the typedef, but it's a bit more confusing.

      --

      -- Pete
      Roundhouse Consulting, Ltd. -- www.versatilecoding.com
      Author of "The Standard C++ Library Extensions: a Tutorial and
      Reference." For more information about this book, see
      www.petebecker.com/tr1book.

      Comment

      • Caleb

        #4
        Re: Ambiguous member function pointer

        I am not very proficient with TR1 yet, so educate me, if you will.
        Does the use of 'std::tr1::func tion' suddenly allow conversion between
        a pointer-to-member and a pointer-to-function (disallowed by the C++
        language proper definition)?
        It allows it in the sense that you can do this:

        class MyClass {
        void someFunction(in t)
        };

        std::tr1::funct ion<int (MyClass*, int)func;
        func = &MyClass::someF unction;

        MyClass mc;
        func(&mc, 10);

        I assume there's some magic going on behind the scenes. But my issue
        is that if MyClass::someFu nction is ambiguous, it won't compile. I'm
        looking for a way to tell the compiler which someFunction to use.

        Comment

        • Caleb

          #5
          Re: Ambiguous member function pointer

          typedef void (MyClass::*fptr )(int);
          >
          func_obj = (fptr)&MyClass: :someFunction;
          >
          You can also do it without the typedef, but it's a bit more confusing.
          Thanks, Pete. This is what I was looking for.

          Caleb

          Comment

          • Pete Becker

            #6
            Re: Ambiguous member function pointer

            Victor Bazarov wrote:
            >
            I am not very proficient with TR1 yet, so educate me, if you will.
            Does the use of 'std::tr1::func tion' suddenly allow conversion between
            a pointer-to-member and a pointer-to-function (disallowed by the C++
            language proper definition)?
            >
            void (MyClass::*)(in t)
            >
            and
            >
            void (*)(MyClass*, int)
            >
            are not the same type. Does 'std::tr1::func tion' somehow overcome
            the problem of those types' incompatibility ?
            >
            Yup, as do std::tr1::mem_f n, std::tr1::bind, and
            std::tr1::refer ence_wrapper. You can wrap a pointer to member function
            inside any of them, and you get a callable object whose function call
            operator takes an argument that's a pointer or reference to an object,
            and calls the member function on that object. In particular,
            std::tr1::funct ion<void(MyClas s*, int)defines a type with a function
            call operator that takes two arguments, the first of type MyClass* and
            the second of type int, and returns void.

            struct S // sorry, MyClass is too long to type.
            {
            void f(int);
            };

            void g(S*, int);

            S *sp = new S;
            std::tr1::funct ion<S*, intfun = g;
            fun(s, 3); // calls g(s, 3)
            s = &S::f; // yes, this assignment is intentional
            fun(s, 3); // calls (s->*f)(3);

            There's actually quite a bit more you can do, like wrap a pointer to
            member data (creating a type with a function call operator that takes
            exactly one argument), and you can call member functions with objects,
            references to objects, pointers to objects, and smart pointers to
            objects. For a more complete description, see sections 6.1 and 6.2 of my
            book, "The C++ Standard Library Extensions."

            --

            -- Pete
            Roundhouse Consulting, Ltd. -- www.versatilecoding.com
            Author of "The Standard C++ Library Extensions: a Tutorial and
            Reference." For more information about this book, see
            www.petebecker.com/tr1book.

            Comment

            • Andrey Tarasevich

              #7
              Re: Ambiguous member function pointer

              Victor Bazarov wrote:
              ...
              Does the use of 'std::tr1::func tion' suddenly allow conversion between
              a pointer-to-member and a pointer-to-function (disallowed by the C++
              language proper definition)?
              >
              void (MyClass::*)(in t)
              >
              and
              >
              void (*)(MyClass*, int)
              >
              are not the same type. Does 'std::tr1::func tion' somehow overcome
              the problem of those types' incompatibility ?
              ...
              Take a look at



              and, in particular, listing four



              Note, that it doesn't deal with the ever-so-popular problem of converting 'void
              (MyClass::*)(in t)' to 'void (*)(int)', i.e. it does not implement the so called
              "closure" functionality. It simply converts the implicit 'this' parameter into
              and explicit one. The latter is not that difficult to achieve with a simple wrapper.

              --
              Best regards,
              Andrey Tarasevich

              Comment

              Working...