如何从任何可调用的函数中获取有意义的函数签名

时间:2014-08-19 12:21:30

标签: c++ function template-meta-programming

考虑这样的野兽:

template<typename Func>
void register_function(Func func) {
  // type-erase Func and pass it on to some other function
}

假设这可以传递给任何可调用的东西。

如果Func是普通函数类型,我知道如何获取函数的签名。鉴于func可以是普通函数,std::function<F>或函数对象(std::bind()表达式),我如何得到函数的参数?

注意:

  • 在这种情况下,函数只有零个,一个或两个参数
  • 如果它是一个功能对象,它是std::bind()
  • 的结果
  • 需要签名才能获得参数的类型,这些类型需要在传递的类型删除的内容中使用

  • 这严格来说是 C ++ 03 (嵌入式平台),因此没有变量模板参数等。

2 个答案:

答案 0 :(得分:10)

不可能。函数对象可以具有重载或模板operator()。因此,它具有“签名”的想法根本不适用,因为它可以有无限数量的签名。

如果将其限制为只有一个签名,则可以使用operator()的地址,然后使用常规模板特化从成员函数指针类型中获取参数。

答案 1 :(得分:0)

如果您在运行时知道某些被调用(普通)函数的签名,您可以使用(在Linux上)libffi来调用它。

如果你在运行时甚至不知道要调用的函数的签名,那是不可能的,因为通常ABI约定将规定根据类型传递函数参数的不同方法。

例如,x86-64 ABI(大多数Linux 64位x86-64系统)都要求浮点值和整数值在不同的寄存器集中传递。

例如参见x86 calling conventions wikipage。