从具有可变参数的函数指针列表中调用函数

时间:2014-01-27 20:07:40

标签: c++ c variadic-functions

一方面,我有一个函数指针列表,指向一堆函数,这些函数具有存储在映射中的不同签名,将每个函数映射到函数ID。函数指针在模板化类中是typedefed,例如:

typedef R (T::*SetPtr_t) (A)
typedef R (T::*SetPtr_t) (A, B)
typedef R (T::*SetPtr_t) (A, B, C)

另一方面,我有另一张地图将相同的功能ID映射到存储参数的内存块。

我正在寻找的是通过从第二个映射传递存储在连续内存块中的参数,通过第一个映射中的函数指针调用函数的自动方式。我正在寻找一种方法来制作它,这样我就不必手动编码每一个我将提取参数并将它们传递给函数的情况,因为有数百个函数。

至于我们试图解决的问题,我们基本上试图避免手工编写很多这些函数调用,并且它适用于只有一个参数的函数是最初的设计。当您尝试支持具有可变数量的参数时,问题就开始了。

到目前为止我唯一发现的是将参数存储在堆栈中并手动调用函数,如下所示: C manually call function with stack and register 但这个解决方案似乎太乱了。我希望有更多的C ++ - 如果可能的话。

希望问题至少是清楚的。

1 个答案:

答案 0 :(得分:0)

好吧,正如Grady Player评论原始帖子,功能对象和绑定(来自C ++ 11的boost::bind / boost::functionstd::bind / std::function)如果你需要存储函数调用(函数指针或函子)及其参数,通常是要走的路。

很可能你可以将参数作为绑定对象存储在map中,只需调用bind / function对象,该对象将负责使用绑定参数调用原始函数。

另一方面,如果您更喜欢或需要保留当前地图,而不是手写调用,您可以使用可变参数模板函数(C ++ 11特性)来生成它们,如:

template<typename R, typename...ParameterTypes typename... ArgumentTypes>
void execute( R (*func)(ParameterTypes...), ArgumentTypes... arguments )
{
    func( static_cast<ParameterTypes...>( arguments... ) );
}

其中static_cast只是转换或解包的一个示例,您可能需要这样做以“适应”您在地图中保存的arguments结构与实际的调用参数。

如果没有关于您的特定情况的更具体信息,很难提供任何更好的建议,但我相信绑定和/或可变的tempaltes可能是解决它的方法。