请考虑以下代码:
templatestruct 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
,4
和5
.另外,在这种情况下,该语法如何f
调用成员函数?
考虑这个例子:
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,我取消引用直到获取函数而不是函数指针用于说明目的.