invoke_result 具有成员 (operator[]) 功能
invoke_result with member (operator[]) function
如何为成员函数正确调用 invoke_result?或者专门针对运算符成员函数。我尝试 std::invoke_result<T::operator[], size_type>
没有成功。在这种情况下,正确的语法是什么?
下面呢?
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
的对象。
不要。使用 decltype(std::declval<T&>()[size_type{}])
或类似的东西(根据需要调整值类别和 cv-qualification)。
invoke_result
适用于有 invocable/callable 对象的情况。你没有,所以不要试图将方钉锤入圆孔。
如何为成员函数正确调用 invoke_result?或者专门针对运算符成员函数。我尝试 std::invoke_result<T::operator[], size_type>
没有成功。在这种情况下,正确的语法是什么?
下面呢?
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
的对象。
不要。使用 decltype(std::declval<T&>()[size_type{}])
或类似的东西(根据需要调整值类别和 cv-qualification)。
invoke_result
适用于有 invocable/callable 对象的情况。你没有,所以不要试图将方钉锤入圆孔。