简体   繁体   中英

Using struct as wrapper for member function

I am trying to use a struct as a wrapper for a member function of a class. I have a templated struct that is supposed to hold a pointer to the member function, but in a generic sense not pointing to the instance's specific function. I already figured out the template specilization, but have not been able to figure out the syntax for the storage of the function.

More clearly : I have class X that has non-static function doY() and doZ() . In the class I have made, class A , I have an instance of X named ex . Depending on the situation I want to call one of the functions. I have made a struct called wrapper . Wrapper should store a reference to doY() or doZ() in a static variable named function by using template specilization. I should then be able to call ex.wrapper::function to run either ex.doY() or ex.doZ() .

This is the current version of my code (showing the specialization for some class B), which leads to a func is not a member of wrapper error

.h

template <class T>
class A
{
    T timer;
    X ex;
    template<class Type>
    struct create_timer_getter{};

    void doSomething()
    {
        timer = ex.wrapper<T>::func();
    }
};

.cpp

template <>
struct A<B>::wrapper<B>
{
    // V-- this is where I am having issues --V
    static const X::(func)(int, int, char) = &X::doY
}

Thank you molbdnilo, that syntax compiled correctly.

The pointer-to-member declaration syntax is return_type (class_name:: variable_name)(parameter_types). The pointer-to-member dereferencing operators are . and ->*

Since then, I have also found an alternative syntax that also works:

typedef return_type (class_name::user_defined_type_name)(parameter_types);
user_defined_type_name variable_name = &namespace(if needed)::class_name::member_function_name;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM