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

Casting between C++ method pointers with identical parameters and compatible return values

本文关键字:之间 指针 方法 C++ 转换 返回值 参数      更新时间:2024-09-28

假设您有以下类:

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指向该类型的指针,也不能使用static_cast<>将其强制转换为该类型。

然而,您可以使用reinterpret_cast<>,这并不奇怪,因为reinterpret_cast<>可以让您做各种各样的事情。

在我的测试中,针对这种情况使用reinterpret_cast<>的代码运行良好。所以我的问题是:

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

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

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

然后这样称呼它:

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

这是因为存储在std::function中的可调用函数的返回类型只需要转换为模板参数(A *(中给定的类型,而不必完全是该类型。在本例中,B *可转换为A *