gpt4 book ai didi

c++ - 指向函数成员的指针 : what does `R(*C::*)(Args...)` mean?

转载 作者:IT老高 更新时间:2023-10-28 22:13:50 25 4
gpt4 key购买 nike

考虑以下代码:

template <class>
struct test: std::integral_constant<int, 0> {};
template<class R, class C, class... Args>
struct test<R(C::*)(Args...)>: std::integral_constant<int, 1> {};
template<class R, class C, class... Args>
struct test<R(*C::*)(Args...)>: std::integral_constant<int, 2> {};
template<class R, class C, class... Args>
struct test<R(**C::*)(Args...)>: std::integral_constant<int, 3> {};
template<class R, class C, class... Args>
struct test<R(C::**)(Args...)>: std::integral_constant<int, 4> {};
template<class R, class C, class... Args>
struct test<R(C::***)(Args...)>: std::integral_constant<int, 5> {};

我完全不知道 (*C::*) 是什么, (**C::*) , (C::**)(C::***)意思是。我想要一个 test<decltype(f)> 的示例谁的value将等于 2 , 3 , 45 .另外,在这种情况下,f 的语法如何?那会调用成员函数吗?

最佳答案

考虑 this example :

struct s {
void test1();
void(*test2)();
void(**test3)();
};

int main() {
static_assert(test<decltype(&s::test1)>::value == 1);
static_assert(test<decltype(&s::test2)>::value == 2);
static_assert(test<decltype(&s::test3)>::value == 3);

auto test4 = &s::test1;
static_assert(test<decltype(&test4)>::value == 4);

auto test5 = &test4;
static_assert(test<decltype(&test5)>::value == 5);
}

以下是类型:

R(C::*)(Args...) - 指向成员函数的指针。
R(*C::*)(Args...) - 指向作为函数指针的数据成员的指针。
R(**C::*)(Args...) - 指向数据成员的指针,它是指向函数指针的指针。
R(C::**)(Args...) - 指向成员函数的指针。
R(C::***)(Args...) - 指向成员函数指针的指针。

要调用这些,请考虑 slightly modified example :

struct s {
void test1() {std::cout << "test1\n";}
void(*test2)() = [] {std::cout << "test2\n";};

void(*test3Helper)() = [] {std::cout << "test3\n";};
void(**test3)() = &test3Helper;

void test4() {std::cout << "test4\n";}
void test5() {std::cout << "test5\n";}
};

int main() {
s obj;

auto test4 = &s::test4;

auto test5Helper = &s::test5;
auto test5 = &test5Helper;

(obj.*(&s::test1))();
(*(obj.*(&s::test2)))(); // note that the dereference is unnecessary
(**(obj.*(&s::test3)))(); // note that the second dereference is unnecessary
(obj.**(&test4))();
(obj.***(&test5))();
}

请注意,在每种情况下,如果您有一个具有相应 &[s::]testN 值的变量,则可以替换 (&[s::]testN) 与该变量。另请注意,对于 test2 和 test3,我取消引用直到获取函数而不是函数指针以用于说明目的。

关于c++ - 指向函数成员的指针 : what does `R(*C::*)(Args...)` mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34035292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com