在具有相同参数和兼容返回值的C++方法指针之间进行强制转换
Casting between C++ method pointers with identical parameters and compatible return values
假设您有以下类:
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<>
的代码运行良好。所以我的问题是:
- 是否有更好/更具体的方法来做到这一点(而不构建间接层(,以及
- 如果不是,这是
reinterpret_cast<>
可以安全使用的罕见情况之一吗
您可以将这些协变成员函数指针存储在std::function
:中
std::function<A*(Gen&, int)> dispatch(&Gen::genB);
然后这样称呼它:
Gen g;
A* b = dispatch(g, 1);
这是因为存储在std::function
中的可调用函数的返回类型只需要转换为模板参数(A *
(中给定的类型,而不必完全是该类型。在本例中,B *
可转换为A *
。
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- AVX 指令中寄存器和指针之间的客观差异
- 禁止指针和整数之间的比较C++
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 类指针之间的 Qt 差异
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在两个.cpp文件之间定义全局类/结构指针
- 按值和引用传递指针之间的区别?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 在C++中的程序之间共享指针
- 指针和程序性能之间有什么关系吗?
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 可以在指向不同模板类实例的指针之间进行强制转换吗
- C++17:unique_ptr<char[]> 和 shared_ptr<char[] 之间的指针存储差异>
- 错误:ISO C++禁止在指针和整数 [-fallowive] 之间进行比较