如何从成员函数指针中删除常量限定符
How to remove const qualifier from a member function pointer
我使用的库包含以下代码:
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
函数成员(至少可以这样做)。
我应该提到的是,对于现在查看这篇文章的人来说,这实际上是我代码中的一个错误(实际上是一个疏忽),在发现问题后不久就修复了。
相关文章:
- 从 Typedef 数据类型中删除常量
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 从嵌套模板中删除常量
- 防止将临时传递为常量引用的方法,该方法比删除 r 值重载更好地缩放
- 不能只删除方法的常量重载?
- std::remove_pointer 无法删除 VS2012 上的常量易失性函数指针
- 当调用来自同一个重载的非常量版本成员函数时,可以删除常量限定符吗
- 从函数返回类型中删除常量是否会中断 ABI
- 如何从'char const*'中删除常量
- 模板引用折叠正在删除常量引用返回类型的cv限定符
- 如何删除类型名中每个元素的常量引用修饰符.T.
- 类成员有自己的常量成员,因此构造函数被隐式删除
- C++无法在递归中删除对象的常量
- 全局静态常量shared_ptr被另一个shared_ptr的析构函数奇怪地窃取和删除,为什么?
- 如果模板参数是指针,则在 getter 上删除了常量限定符
- 如何在 c++ 中删除常量数组
- 类型为 std::String&- 的非常量引用的初始化无效 - 如何删除
- 错误:在此处声明unique_ptr(常量 unique_ptr&) = 删除;
- 为什么在 C++11 中删除了对逗号运算符在常量表达式中的限制
- DirectX11如何从常量缓冲区中删除未使用的变量