获取 boost::hana::partial::operator() 的地址
Taking the address of boost::hana::partial::operator()
假设我有一个执行某些操作的 lambda:
auto thing = [](int x){ /* Stuff */ };
我想保存值 "x" 并稍后调用它,所以我这样做:
auto other = boost::hana::partial(thing, 42);
现在,因为我想对此进行一些类型擦除,所以我想获取 operator()
的地址......所以我尝试这样做:
using type = decltype(other);
void (type::*ptr)(void) = &type::operator();
Clang 抱怨说,other
对象的功能不足以满足要求:godbolt
似乎 partial
类型正在返回一个引用(对 void
?)......为什么这不起作用?
它(operator())有 &
const&
&&
等重载;您的成员函数指针不符合 const 或 r/l 值的 *this
。所以不匹配。
在编译失败的行=
前添加&
或const&
或&&
或const&&
,即可编译。
这是一个[MCVE]:
struct foo {
void bar()&{}
};
int main(){
auto p = &foo::bar;
void(foo::*p2)() = p; // lacks &
}
假设我有一个执行某些操作的 lambda:
auto thing = [](int x){ /* Stuff */ };
我想保存值 "x" 并稍后调用它,所以我这样做:
auto other = boost::hana::partial(thing, 42);
现在,因为我想对此进行一些类型擦除,所以我想获取 operator()
的地址......所以我尝试这样做:
using type = decltype(other);
void (type::*ptr)(void) = &type::operator();
Clang 抱怨说,other
对象的功能不足以满足要求:godbolt
似乎 partial
类型正在返回一个引用(对 void
?)......为什么这不起作用?
它(operator())有 &
const&
&&
等重载;您的成员函数指针不符合 const 或 r/l 值的 *this
。所以不匹配。
在编译失败的行=
前添加&
或const&
或&&
或const&&
,即可编译。
这是一个[MCVE]:
struct foo {
void bar()&{}
};
int main(){
auto p = &foo::bar;
void(foo::*p2)() = p; // lacks &
}