Ada*_*ura 17 c++ metaprogramming
在C++中有没有办法确定可调用对象的函数签名?
考虑以下:
template< typename F >
void fun(F f)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
让我们假设fun只用可调用的"东西"来调用它.
在里面fun我想知道什么是功能的签名f.这应该适用于函数指针,引用,包装器,lambdas,绑定,函数对象(假设它们只有一个operator ())等等.我受限于Visual Studio 2010 SP 1,但即使不使用该编译器,我也对标准解决方案感兴趣.
(函数签名Return_Type ([Arg1_Type [, Arg2_Type [, ... ] ] ]);与std::function/ boost::function.相同)
知道至少返回值的部分解决方案具有f一定的价值.(我已经尝试std::result_of但无论如何都无法让它工作.)
f()在 C++0x 兼容的编译器上,您至少可以通过使用 来获取结果类型decltype(f())。Visual C++ 2010应该支持decltype,尽管我自己还没有检查过。至于获取参数类型,我不确定是否有一种方法可以使用函数指针。
Boost.Function 似乎已经解决了这个问题,至少在某些编译器上(例如,它不适用于旧版本的 VC++ 或 Borland C++)。它可以包装函数指针并为其提取参数。然而,该解决方案似乎相当复杂,它涉及使用 Boost.PP 定义多个模板。如果您想尝试重新实现所有内容,您当然可以尝试,但我认为您也可以使用虚拟的 Boost.Function 包装器来使事情变得更容易,例如boost::function<decltype(f)>::second_argument_type获取第二个参数类型。