Home > Software engineering >  How to take address of templated member function instance in C ?
How to take address of templated member function instance in C ?

Time:01-28

I was trying to take address of templated member function instance. For some reason, it is not working. Here is minimal reproducible example:

class X {
    public:

    template<bool B>
    inline void f() {}

    const decltype(f<true>)* truef = f<true>;
    const decltype(f<false>)* falsef = f<false>;
};

The above code is giving the following error:

<source>:7:27: error: 'decltype' cannot resolve address of overloaded function
    7 |     const decltype(f<true>)* truef = f<true>;
      |                           ^
<source>:8:28: error: 'decltype' cannot resolve address of overloaded function
    8 |     const decltype(f<false>)* falsef = f<false>;
      |                            ^
<source>:7:38: error: cannot resolve overloaded function 'f' based on conversion to type 'const int*'
    7 |     const decltype(f<true>)* truef = f<true>;
      |                                      ^~~~~~~
<source>:8:40: error: cannot resolve overloaded function 'f' based on conversion to type 'const int*'
    8 |     const decltype(f<false>)* falsef = f<false>;

But the same code works if f wasn't a member function:


template<bool B>
inline void f() {}

constexpr decltype(f<true>)* truef = f<true>;
constexpr decltype(f<false>)* falsef = f<false>;

So, how to take address of templated member function instance in C ?

CodePudding user response:

The correct syntax to get a pointer to a member function would be: &classname::membername so that the program should be modified to as shown below.

Basically, pointer to member functions distinct from ordinary pointers(like pointer to normal functions).

class X { 
    public:

    template<bool B>
    inline void f() {}
//-----------------vvvv------------------------------->changed syntax here
    const decltype(&X::f<true>) truef = &X::f<true>;
    const decltype(&X::f<false>) falsef = &X::f<false>;
};

Demo

  • Related