考虑这样的野兽:
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 (嵌入式平台),因此没有变量模板参数等。
答案 0 :(得分:10)
不可能。函数对象可以具有重载或模板operator()
。因此,它具有“签名”的想法根本不适用,因为它可以有无限数量的签名。
如果将其限制为只有一个签名,则可以使用operator()的地址,然后使用常规模板特化从成员函数指针类型中获取参数。
答案 1 :(得分:0)
如果您在运行时知道某些被调用(普通)函数的签名,您可以使用(在Linux上)libffi来调用它。
如果你在运行时甚至不知道要调用的函数的签名,那是不可能的,因为通常ABI约定将规定根据类型传递函数参数的不同方法。
例如,x86-64 ABI(大多数Linux 64位x86-64系统)都要求浮点值和整数值在不同的寄存器集中传递。
例如参见x86 calling conventions wikipage。