我有以下代码:
#include <iostream>
#include <string>
using namespace std;
struct foo_s {
string a;
string b;
string c;
};
void print_field(foo_s* foo, string foo_s::* field) {
cout << "field: " << field << " - " << foo->*field << endl;
}
int main() {
foo_s my_foo = {
"a",
"b",
"c",
};
print_field(&my_foo, &foo_s::a);
print_field(&my_foo, &foo_s::b);
print_field(&my_foo, &foo_s::c);
return 0;
}
它的输出是:
field: 1 - a
field: 1 - b
field: 1 - c
我在理解 print_field()
函数中发生的事情的具体细节时遇到了一些麻烦。即:
字段
的类型是什么?我想它是pointer-to-string-foo_s-member
- 为什么
field
的值总是相同(在本例中为 1),而foo->*field
却产生不同的结果?
主要是,我对第 2 点感到困惑。我想象 field 是从结构开始的“偏移量”, foo->*field
在概念上等同于类似的东西
char* ptr = static_cast<char*>(foo);
ptrdiff_t offset = somehow_get_the_byte_offset_from_pointer_to_member(field);
ptr = ptr[offset];
string result = *static_cast<string*>(ptr);
但这似乎是错误的,因为 field
的值在不同的调用中没有变化。我错过了什么?标准具体是如何描述这个具体操作的?
最佳答案
<<
没有过载格式化成员指针的值,所以如果你尝试,你不会得到任何特别有用的东西。 bool
过载, 成员指针可转换为 bool
,所以这就是这里发生的事情。指针不为空,因此它转换为 true
,默认情况下格式为 1
.
为了进一步演示,您可以尝试流式传输 boolalpha
第一的;那么你应该看到 true
而不是 1
.
关于c++ - 为什么指向成员的指针的值对于同一结构的不同成员总是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262521/