在派生类对象上使用基类成员函数指针

3

考虑以下代码片段:

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

一切看起来都很好。

我的问题是:这段代码是否正确?还是我正在踩undefined行为的领域?我可以直接在派生类对象上使用基类的成员函数指针吗?


2
我以前没有考虑过在std::integral_constant中存储指针。这是一个有趣的方法。 - François Andrieux
@FrançoisAndrieux 很高兴听到我的问题的一部分对其他人有用 :) - Artur Pyszczuk
1个回答

3

大致而言,成员属于子对象,因此必须使用其类型来标识它。这确实非常好。

相反的方式实际上甚至无法编译:

struct Ptr : std::integral_constant<std::string (Der:: *) () const, &Der::foo> {};

错误很明显:
错误: 无法将模板参数“&Base::foo”从“[...] (Base::)() const}”转换为“[...] (Der::)() const”
这是使用[...]缩短了错误信息。

是的,我尝试了您发布的内容,这就是为什么我会问关于基类的问题的原因 :) 无论如何,谢谢。 - Artur Pyszczuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接