在具有相同参数和兼容返回值的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<>这种情况下的代码工作正常。所以我的问题是:
- 有没有更好/更具体的方法来做到这一点(不建立一个间接层),以及
- 如果不是,这是
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 *.