c++ - 如何从成员函数指针中删除 const 限定符

标签 c++ templates pointers c++11 function-pointers

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

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' or whatever the type of the const member function is.

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

最佳答案

作为Adam S在评论中指出,当他尝试编译 this simple code 时会发生此错误使用库 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中的代码 header 。其中有两个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 函数成员(至少以您这样做的方式)。

关于c++ - 如何从成员函数指针中删除 const 限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23213448/

相关文章:

c++ - 关于模拟系统调用的建议

c++ - 在不明确时在转换运算符之间进行选择

c++ - 将模板 typedef 的数组传递给构造函数

c++ - 将函数引用传递到模板警告 : ignoring attributes on template argument 'func signature'

c++ - 数组元素的值保持不变

c++ - 使用无符号循环变量进行反向迭代

c++ (g++-4.x) 模板问题

c++ - const char * 在 while 循环的下一次迭代中被覆盖

c++ - 通过指针删除非拥有的动态数组

pointers - nullify(pointer) 和 pointer => null() 的区别