当前位置:  开发笔记 > 编程语言 > 正文

指向函数成员的指针:`R(*C ::*)(Args ...)`是什么意思?

如何解决《指向函数成员的指针:`R(*C::*)(Args)`是什么意思?》经验,为你挑选了1个好方法。

请考虑以下代码:

template 
struct test: std::integral_constant {};
template
struct test: std::integral_constant {};
template
struct test: std::integral_constant {};
template
struct test: std::integral_constant {};
template
struct test: std::integral_constant {};
template
struct test: std::integral_constant {};

我绝对没有什么想法(*C::*),(**C::*),(C::**)(C::***)的意思.我想的一个例子test,其value将等于2,3,45.另外,在这种情况下,该语法如何f调用成员函数?



1> chris..:

考虑这个例子:

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

int main() {
    static_assert(test::value == 1);   
    static_assert(test::value == 2);   
    static_assert(test::value == 3);   

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

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

以下是类型:

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

要调用这些,请考虑稍微修改的示例:

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,我取消引用直到获取函数而不是函数指针用于说明目的.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有