我正在研究LLVM源代码,我从未遇到过以下语法:
class BasicBlock {
public:
typedef iplist<Instruction> InstListType;
private:
InstListType InstList;
static iplist<Instruction> BasicBlock::*getSublistAccess(Instruction*) {
return &BasicBlock::InstList;
}
}
上面定义了什么?起初它似乎是一个正常的静态函数,但我不理解BasicBlock::*
部分。看起来像一个静态函数,它返回一个成员函数指针,并直接执行该成员函数的代码。
答案 0 :(得分:1)
静态成员函数getSublistAccess
的返回类型是
iplist<Instruction> BasicBlock::*
,指向类BasicBlock
的非静态数据成员的指针,其中数据类型为iplist<Instruction>
。
getSublistAccess
实际返回的是&BasicBlock::InstList
,这正是类BasicBlock
的非静态数据成员,其中数据类型为InstListType
。即,iplist<Instruction>
。
答案 1 :(得分:0)
是一个功能指针 您可以阅读 this article 了解详细信息。
答案 2 :(得分:0)
感谢 iavr 的答案。我正在给他回答,但我想在这里添加一些细节,希望能帮助读这篇文章的人。
我要求和iavr向我解释的内容可能会被以下代码理解:
#include <iostream>
using namespace std;
struct customType {
int b;
};
struct Instruction {};
class BasicBlock {
public:
BasicBlock(int a) { InstList.b = a; }
customType InstList;
static customType BasicBlock::*getSublistAccess(Instruction*) {
return &BasicBlock::InstList;
}
};
int main() {
BasicBlock bb(90);
Instruction justForSignature;
// Get a pointer to a member of type customType through the static function
customType BasicBlock::* ptrToMember = BasicBlock::getSublistAccess(&justForSignature);
cout << (bb.*ptrToMember).b; // Parenthesis are necessary, '.' has higher precedence on *
// Output: 90
return 0;
}