C ++的一个很酷的功能是,它允许您创建指针到成员类型的变量。最常见的用例似乎是获取方法的指针:
struct foo
{
int x() { return 5; }
};
int (foo::*ptr)() = &foo::x;
foo myFoo;
cout << (myFoo.*ptr)() << '\n'; // prints "5"
但是,一团糟,我意识到它们也可以指向成员变量:
struct foo
{
int y;
};
int foo::*ptr = &foo::y;
foo myFoo;
myFoo.*ptr = 5;
cout << myFoo.y << '\n'; // prints "5"
这很不错。这使我进行了进一步的实验:如果您可以获得指向结构子成员的指针,该怎么办?
struct foo
{
int y;
};
struct bar
{
foo aFoo;
};
int bar::*foo::*ptr;
这实际上可以编译。
但是,我不知道如何分配有用的东西。没有下列作品:
int bar::*foo::*ptr = &bar::foo::y; // no member named "foo" in "bar"
int bar::*foo::*ptr = &bar::aFoo::y; // no member named "aFoo" in "bar" (??)
int bar::*foo::*ptr = &foo::y; // can't init 'int bar::*foo::*' with 'int foo::*'
此外,根据由此产生的错误,看来这种类型与我的想法不完全相同:
int bar::*foo::*ptr = nullptr;
bar myBar;
myBar.*ptr = 4; // pointer to member type ‘int bar::*’ incompatible
// with object type ‘bar’
看来这个概念回避了我。显然,我不能排除它只是以完全不同于我期望的方式进行了解析。
谁能解释一下int bar::*foo::*
实际是什么?为什么gcc告诉我指向的成员的指针bar
与bar
对象不兼容?我将如何使用int bar::*foo::*
,以及如何构造有效的?
decltype()
使用适当的模板提供什么?