【问题标题】:invoke_result with member (operator[]) function带有成员 (operator[]) 函数的invoke_result
【发布时间】:2019-07-06 00:31:21
【问题描述】:

如何为成员函数正确调用 invoke_result?或者专门用于操作员成员函数。我试过std::invoke_result<T::operator[], size_type> 没有成功。在这种情况下,正确的语法是什么?

【问题讨论】:

  • @TedLyngmo 我只是认为我的代码会产生误导,因为它只会偏离主要问题。 T 无论如何这里是一个模板类型名,因此它通常适用于任何提供 operator[] 且一个参数为 size_t 的类。
  • 我认为您低估了愿意提供帮助的人。 :-) 你的代码很少会误导!
  • @TedLyngmo 我不怀疑人们愿意提供帮助,我只知道我可能不会很好地提供一个不会误导的最小示例。我去过那里,我做到了。结果通常很糟糕,因为我的代码中有不相关的细节会误导试图回答的人,所以我尽量只提供最近最少的必要细节。
  • @ightxbulb - 好的,希望你在 SO 的未来会很美好。我的手腕时不时地被打耳光——我在这个行业已经有 40 年的历史了。这不是一个简单的游戏 - 但每一分钟都值得!

标签: c++ operators c++17 member-functions invoke-result


【解决方案1】:

不要。使用decltype(std::declval<T&>()[size_type{}]) 或类似的东西(根据需要调整值类别和cv-qualification)。

invoke_result 用于当您有可调用/可调用对象时。你没有,所以不要试图把方钉锤入圆孔。

【讨论】:

  • 这行得通。我认为它不会通过调用 declval 来构造 T ,是吗?因为在这种情况下 T 相当大。
  • @lightxbulb decltype 采用未计算的操作数。所以不,它在运行时不构造任何东西。
  • 这是否意味着它在编译时构造它(如果有多个编译时调用,可能会增加编译时间)?
【解决方案2】:

下面呢?

std::invoke_result<decltype(&T::operator[]), T, size_type>

但这种语法应该适用于单个而不是模板 operator[]

如果模板或过载,你应该避免std::invoke_result,并遵循T.C.建议的decltype()方式

或者,也许,您可以将调用包装在 lambda 函数中,并将 std::invoke_result 应用于 lambda(如果您真的非常想使用 std::invoke_result)。

关于std::invoke_result 语法,与指向常规函数的指针相比,指向成员函数的指针是完全不同的东西。不管怎样,你可以粗略地把它看作是一个常规函数的指针,它接收一个附加参数(在第一个位置),该参数对应于调用其方法的对象。

因此,在您的示例中,第一个 T 参数表示调用其运算符的 T 类型的对象。

【讨论】:

  • 我收到了cannot determine which instance of overloaded function ... is intended
  • @lightxbulb - 我想你的班级里有更多 operator[]const 而不是-const 版本?)。
  • @lightxbulb:也许你应该用minimal reproducible example 更新你的问题。
  • @max66 它有 const 和非 const 版本,是的。没有其他过载。这是导致问题的原因吗?
  • @lightxbulb - 是的,我想是的。如前所述:“此语法应与单个而不是模板 operator[] 一起使用”。要验证,请尝试评论非常量版本以查看错误是否消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2018-06-25
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多