如何从成员函数指针中删除常量限定符

How to remove const qualifier from a member function pointer

本文关键字:常量 删除 指针 成员 函数      更新时间:2023-10-16

我使用的库包含以下代码:

template <typename M>
void _register_member(lua_State *state,
                      const char *member_name,
                      M T::*member) {
    std::function<M(T*)> lambda_get = [member](T *t) {
                //^ error here
        return t->*member;
    };
    //...

但是,此代码不接受const成员函数指针。传递这些会产生错误Function cannot return function type 'void () const',或者无论常量成员函数的类型是什么

如何从传递的成员函数中删除const限定符,或者如何应用std::remove_const

Adam S在评论中指出,当他试图编译使用库Selene:的简单代码时,会发生此错误

#include <selene.h>
class C {
public:
    bool get() const;
};
bool C::get() const {return true;}
int main() {
    sel::State state;
    state["C"].SetClass<C>("get", &C::get);
}

编译器无法编译Class.h标头中的代码。类Class的函数成员_register_member有两个重载:

template <typename T,
          typename A,
          typename... Members>
class Class : public BaseClass {
private:
    // ...
    template <typename M>
    void _register_member(lua_State *state,
                          const char *member_name,
                          M T::*member) {
        // ...
    }
    template <typename Ret, typename... Args>
    void _register_member(lua_State *state,
                          const char *fun_name,
                          Ret(T::*fun)(Args...)) {
        // ...
    }
    // ...
};

当指向const函数成员的指针作为第三个参数传递时,编译器无法选择第二个重载。应该存在另一个可以接受const函数成员的重载。应声明如下:

template <typename Ret, typename... Args>
void _register_member(lua_State *state,
                      const char *fun_name,
                      Ret(T::*fun)(Args...) const)
                                            ^^^^^

如果没有这种重载,编译器会选择第一个重载,该重载是为使用指向数据成员(而不是函数成员)的指针而创建的,并且无法编译其代码。

因此,在使用Selena库的当前版本时,您无法处理const函数成员(至少可以这样做)。

我应该提到的是,对于现在查看这篇文章的人来说,这实际上是我代码中的一个错误(实际上是一个疏忽),在发现问题后不久就修复了。