请考虑以下代码段:
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
一切似乎都很好。
我的问题是:此代码是否正确?还是我踩着未定义的行为?我可以直接使用指向派生类对象的基类成员函数的指针吗?
答案 0 :(得分:3)
粗略地说,该成员属于子对象,因此您必须使用其类型来识别它。非常好。
反过来甚至不实际编译:
struct Ptr : std::integral_constant<std::string (Der:: *) () const, &Der::foo> {};
错误很明显:
错误:无法将模板参数'&amp; Base :: foo'从'[...](Base :: )()const}'转换为'[...](Der :: < / em>)()const'
我使用[...]
来减少它。