C++ typedef member function signature syntax

后端 未结 5 1721
清酒与你
清酒与你 2020-12-23 17:22

I want to declare type definition for a member function signature. Global function typedefs look like this:

typedef int (function_signature)(int, int);
typed         


        
5条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-23 17:36

    For questions regarding the awkward function pointer syntax, I personally use a cheat-sheet: The Function Pointers Tutorial (downloadable here, thanks to Vector for pointing it out).

    The signature of a member function, however, is a bit different from the signature of a regular function, as you experienced.

    As you probably know, a member function has a hidden parameter, this, whose type need be specified.

    // C++11 and above.
    using Member = int (Foo::*)(int, int);
    
    // C++03 and below.
    typedef int (Foo::*Member)(int, int);
    

    does let you specify that the first element passed to the function will be a Foo* (and thus your method really takes 3 arguments, when you think of it, not just 2.

    However there is another reason too, for forcing you to specify the type.

    A function pointer might refer to a virtual function, in which case things can get quite complicated. Therefore, the very size of the in-memory representation changes depending on the type of function. Indeed, on Visual Studio, a function pointer's size might vary between 1 and 4 times the size of a regular pointer. This depends on whether the function is virtual, notably.

    Therefore, the class the function refers to is part of the signature, and there is no work-around.

提交回复
热议问题