在我的班级中,我有一个名为CallFn()
的函数,该函数需要从参数中分配,以及未定义的参数数量,包括它们的类型。然后我需要使用params中提供的数据和存储在类变量中的函数地址来调用另一个函数。这样做的最佳做法是什么?如何实现?
让我们把它作为一个伪示例:
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
和模板进行别名声明)时,很少有想法浮现在脑海中,但即使在经过大量实际编写即用型代码之后,我也太过初衷了。搜索,所以我决定发布,看看是否可能有替代或甚至更好的方式来实现,我想做什么,甚至可能进一步改进这个想法。
答案 0 :(得分:0)
使用函数template和auto说明符。这是一个简单的例子。
#include <iostream>
class Example
{
public:
template<typename A>
auto test(A x) -> decltype(x)
{
return x;
}
};
int main()
{
Example obj;
/* The function below is of type int and its argument is int */
std::cout << obj.test(5) << std::endl;
return 0;
}
我不知道你是否可以使用void
,但也许你可以考虑在这种情况下超载。