【发布时间】:2017-10-01 03:13:47
【问题描述】:
我正在创建一个接受函数指针的模板化函数,尽管我试图进一步简化语法。
到目前为止,我有类似的东西:
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.
}
显然这不会编译 - “函数原型中不允许使用 decltype(auto)”。有没有更好的方法来解决这个问题?
我知道我可以直接在函数类型上进行模板化,但我希望避免在使用模板或使用decltype(&obj::func) 时写出模板函数类型。无论如何,我需要将参数args 作为模板参数在模板中明确显示。
我猜编译器需要明确知道函数指针类型,而不仅仅是对象和一些参数。我要求太多了吗?也许我是?
【问题讨论】:
-
为什么要关心返回类型的长度?您显示的代码中没有任何地方需要拼写出来。展示一个您认为需要解决的实际问题的示例。
-
显然当我使用模板时,我必须指定返回类型。在我的场景中,我有一个
std::vector<std::array<std::complex<float>,GetArraySize()>>&,它看起来就像嵌入在该函数模板中的垃圾。这绝对无助于代码的可读性。这是一个实际问题。 -
为什么你认为在使用模板时需要指定返回类型?模板参数推导在哪些方面对您不起作用?同样,举一个例子,你认为你必须拼出一个长类型。
-
为什么不简单地将
typename obj, typename ret替换为class func,然后声明func f并传递任何支持operator()的内容,包括函数指针、函子等
标签: c++ templates return c++14 c++17