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

sbi*_*sbi 5 c++ function template-meta-programming

考虑这样一个野兽:

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

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

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

注意:

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

  • 这是严格的C++ 03(嵌入式平台),所以没有变量模板参数等.

Pup*_*ppy 10

不可能.函数对象可能已经过载或模板化operator().因此,它具有"签名"的想法根本不适用,因为它可以具有无限数量的签名.

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