繁体   English   中英

指向std :: invoke中成员函数对象的指针

[英]Pointer to member function-object in std::invoke

为什么std :: invoke不能使用指向成员的指针,该成员是带参数的函数对象? 像这样:

struct MyClass
{
    std::function<void(int)> functor{ [](int arg) { printf("%d\n", arg); } };
};
int main()
{
    MyClass mc;
    std::invoke(&MyClass::functor, mc, 110);
}

打印: 'std::invoke': no matching overloaded function found. 我在Visual C ++和g ++中检查过这个。

而且, std::is_invocable_v<decltype(&MyClass::functor), MyClass, int>声称这个仿函数不可调用,这绝对是错误的。 我错过了什么或者它是标准中的缺陷吗? 如果这种行为是正确的,那么std :: invoke及其所有朋友的观点是什么? 我的意思是简单的函数对象可以很容易地调用,没有任何设施,但我虽然std :: invoke的主要目的是概括和简化所有callables的工作,包括棘手的,如指向成员的指针。 std :: invoke无法调用一个明确可调用的目标的事实对我来说似乎很奇怪。

问题是functor不是函数,而是数据成员。 因此, &MyClass::functor不是指向成员函数的指针,而是指向成员数据的指针。 这种区别意味着你不能将任何其他参数传递给std::invoke ,因为你不能调用数据成员; 但是对于一些数据成员,就像你的functor一样。 在C ++ 11之前,标准尚不清楚,因此有LWG问题1520在C ++ 11中合并。

我的意思是你可以将你的例子重写为:

std::invoke(&MyClass::functor, mc)(110);
// or for maximum confusion
std::invoke(std::invoke(&MyClass::functor, mc), 110);

但我不认为这就是你想要的。 感谢Barry ,这是一个坏主意,正如以下代码所做的那样:

struct X {
  std::function<void()> f;
};
std::invoke(&X::f, x); // gets f, or calls f?

获取f会使其与其他数据成员保持一致,但如果f不带参数,则无法调用f 调用f意味着当您只想获取它们时,您会与其他数据成员不一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM