【问题标题】:C++ Function type and params including their type as argumentsC++ 函数类型和参数,包括它们的类型作为参数
【发布时间】: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


【解决方案1】:

使用函数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一起工作,但也许你可以考虑在这种情况下重载。

【讨论】:

  • 谢谢,您介意详细说明我将如何覆盖该特定函数并添加参数及其类型作为参数吗?
猜你喜欢
  • 2014-12-16
  • 1970-01-01
  • 2015-09-04
  • 2012-07-07
  • 2011-12-14
  • 2017-02-25
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多