gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:12:52 26 4
gpt4 key购买 nike

假设你有这些类:

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 *

关于c++ - 在具有相同参数和兼容返回值的 C++ 方法指针之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67579612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com