函数指针参数的自动返回类型?

时间:2017-10-01 03:13:47

标签: c++ templates return c++14 c++17

我正在创建一个带有函数指针的模板化函数,尽管我试图进一步简化语法。

到目前为止,我有类似的内容:

template< typename obj, typename ret, typename... args >
auto py_wrapped_func( ret (obj::*f)( args... ) )
{
    // Do some stuff with the function pointer.
}

麻烦的是,有时回归类型,ret,是疯狂的。我想知道是否有办法将其简化为:

template< typename obj, typename... args >
auto py_wrapped_func( decltype(auto) (obj::*f)( args... ) )
{
    // Do some stuff with the function pointer.
}

显然这不会编译 - &#34;在函数原型&#34;中不允许使用decltype(auto)。有没有更好的方法来解决这个问题?

我知道我可以直接在函数类型上模板,但我更倾向于避免在使用模板或使用decltype(&obj::func)时写出模板函数类型。我需要将参数args作为模板参数在模板中显式化。

我猜测编译器需要明确地了解函数指针类型,而不仅仅是对象和一些参数。我问得太多了吗?也许我是?

1 个答案:

答案 0 :(得分:0)

这可能是this问题的重复。

函数的参数不能通过模板参数推导提供,但函数可以。一个简单的解决方案是重新排列模板参数,如下所示:

template< typename... args, typename obj, typename ret >
auto py_wrapped_func( ret (obj::*f)( args... ) )
{
    // Do some stuff with the function pointer.
}

现在可以从参数中推断出对象和返回类型。

我不确定这会在左侧使用可变参数模板参数。但似乎编译得很好......