在具有相同参数和兼容返回值的C++方法指针之间进行转换

假设你有这些类:

class A {};
class B : public A {};
class C : public A {};

class Gen {
public: 
     A* genA(int val);
     B* genB(int val);
     C* genC(int val);
};
    

有了这些,我可以做到这一点:

Gen g;
A* a = g.genA(1);
A* b = g.genB(1);
A* c = g.genC(1);

现在,假设我想传递生成函数以避免必须构建枚举和表或其他一些间接层。(并且还假设因为没有写,Gen我不能只更改返回类型。)然后我想要这样的 typedef:

typedef A* (Gen::*GenMethod)(int);

不幸的是,您不能直接将 &Gen::genB 或 &Gen::genC 分配给该类型的指针,也不能使用 astatic_cast<>将其强制转换为该类型。

但是,您可以使用 a reinterpret_cast<>,这并不奇怪,因为它reinterpret_cast<>可以让您做各种事情。

在我的测试中,使用reinterpret_cast<>这种情况下的代码工作正常。所以我的问题是:

  1. 有没有更好/更具体的方法来做到这一点(不建立一个间接层),以及
  2. 如果不是,这是reinterpret_cast<>可以安全使用a 的罕见情况之一吗?

回答

您可以将这些协变成员函数指针存储在 a 中std::function

std::function<A*(Gen&, int)> dispatch(&Gen::genB);

然后像这样调用它:

Gen g;
A* b = dispatch(g, 1);

这是有效的,因为存储在 a 中的可调用对象的返回类型std::function只需可转换为模板参数 ( A *) 中给定的类型,而不必完全是该类型。在这个例子中,B *是 convertibel 到A *.


以上是在具有相同参数和兼容返回值的C++方法指针之间进行转换的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>