【发布时间】:2015-10-24 11:24:10
【问题描述】:
在我的课堂上,我有一个名为 CallFn() 的函数,需要从参数分配类型,以及未定义数量的参数,包括它们的类型。然后,我需要使用参数中提供的数据 + 存储在类变量中的函数地址调用另一个函数。这样做的最佳做法是什么?我该如何实现?
让我们以此为伪例子:
class MyClass
{
public:
DWORD dwAddress = 0x12345;
// Function type A = void in the current example
// However there could be more or less arguments
A CallFn( FUNC_TYPE A, void* B, unsigned int C, bool D )
{
// Call this function
}
};
然后这样称呼它:
MyClass->CallFn(void, void* B, unsigned int C, bool D);
// or
MyClass->CallFn(bool, int B, DWORD C, char* D);
和以前一样,我只需要一个 typedef 并手动使用地址进行转换:
typedef void( __thiscall *CallFn )( void*, unsigned int, bool );
CallFn _CallFn;
_CallFn = ( CallFn ) ( DWORD ) 0x12345;
几乎没有想到使用现代 c++ 标准的想法,例如使用 using 和模板的别名声明,但是即使经过大量搜索,我也是一个初学者,无法实际编写现成的代码,所以我决定发帖,看看是否有替代甚至更好的方法来实现,我想做的事情,甚至可能进一步改进这个想法。
【问题讨论】:
-
使用
std::function而不是原始函数指针。 -
查看模板。它们提供了编写适用于任意类型的函数的机制(只要它们支持函数对它们所做的事情)。
-
感谢您的快速回复,
std::function结合模板实际上似乎是一个不错的解决方案,但是是否可以使 std::function 本身成为一个函数并返回定义的调用以使其更干净?或者实现这一点的最佳方法是什么?有一个带参数的简单函数创建一个新的std::function然后调用它似乎有点尴尬。 -
显然 std::function 在 VS 2015 RTM 上尚不支持,任何替代 @πάνταῥεῖ ?
标签: c++ templates c++11 typedef