C ++函数类型和参数,包括它们作为参数的类型

时间:2015-10-24 11:24:11

标签: c++ templates c++11 typedef

在我的班级中,我有一个名为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和模板进行别名声明)时,很少有想法浮现在脑海中,但即使在经过大量实际编写即用型代码之后,我也太过初衷了。搜索,所以我决定发布,看看是否可能有替代或甚至更好的方式来实现,我想做什么,甚至可能进一步改进这个想法。

1 个答案:

答案 0 :(得分:0)

使用函数templateauto说明符。这是一个简单的例子。

#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,但也许你可以考虑在这种情况下超载。