使用成员(operator[])函数调用_result

问题描述 投票:0回答:3

如何正确调用成员函数的invoke_result?或者专门用于运算符成员函数。我尝试了

std::invoke_result<T::operator[], size_type>
但没有成功。在这种情况下,正确的语法是什么?

c++ operators c++17 member-functions invoke-result
3个回答
7
投票

不要。使用

decltype(std::declval<T&>()[size_type{}])
或类似的东西(根据需要调整值类别和简历资格)。

invoke_result
适用于当您有可调用/可调用对象时。您没有,所以不要尝试将方钉锤入圆孔中。


5
投票

下面怎么样?

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
类型的对象。


0
投票
// 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, "Несоответствие типов");
© www.soinside.com 2019 - 2024. All rights reserved.