如何正确调用成员函数的invoke_result?或者专门用于运算符成员函数。我尝试了
std::invoke_result<T::operator[], size_type>
但没有成功。在这种情况下,正确的语法是什么?
不要。使用
decltype(std::declval<T&>()[size_type{}])
或类似的东西(根据需要调整值类别和简历资格)。
invoke_result
适用于当您有可调用/可调用对象时。您没有,所以不要尝试将方钉锤入圆孔中。
下面怎么样?
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
类型的对象。
// Tank you! Thanks to your hint, I got the following
code:
struct C_STRUCT {
double Func(char, int&) { return 3.14; };
};
std::invoke_result<decltype(&C_STRUCT::Func), C_STRUCT,
char, int&>::type dbl_var_g = 3.14;
static_assert(std::is_same<decltype(dbl_var_g),
double>::value, "Несоответствие типов");