我正在使用包含以下代码的库:
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/