考虑以下代码片段:
struct Base {
std::string foo () const { std::cout << "Base::foo()\n"; return "X"; }
};
struct Der : Base {};
struct Ptr : std::integral_constant<std::string (Base:: *) () const, &Base::foo> {};
用法是这样的:
Der der;
std::string s = (der.*Ptr::value) ();
std::cout << s << "\n";
输出如愿:
Base::foo()
X
一切似乎都很好。
我的问题是:这段代码是否正确?还是我踩到了未定义行为的土地?我可以直接在派生类的对象上使用指向基类成员函数的指针吗?
最佳答案
粗略地说,成员属于子对象,因此您必须使用其类型来识别它。确实非常好。
另一种方式实际上甚至不能编译:
struct Ptr : std::integral_constant<std::string (Der:: *) () const, &Der::foo> {};
错误很明显:
error: could not convert template argument '&Base::foo' from '[...] (Base::)() const}' to '[...] (Der::)() const'
我使用 [...]
来减少一点。
关于c++ - 在派生类的对象上使用指向基类成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47478722/