【问题标题】:Automatic return types for function pointer arguments?函数指针参数的自动返回类型?
【发布时间】: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(&amp;obj::func) 时写出模板函数类型。无论如何,我需要将参数args 作为模板参数在模板中明确显示。

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

【问题讨论】:

  • 为什么要关心返回类型的长度?您显示的代码中没有任何地方需要拼写出来。展示一个您认为需要解决的实际问题的示例。
  • 显然当我使用模板时,我必须指定返回类型。在我的场景中,我有一个std::vector&lt;std::array&lt;std::complex&lt;float&gt;,GetArraySize()&gt;&gt;&amp;,它看起来就像嵌入在该函数模板中的垃圾。这绝对无助于代码的可读性。这是一个实际问题。
  • 为什么你认为在使用模板时需要指定返回类型?模板参数推导在哪些方面对您不起作用?同样,举一个例子,你认为你必须拼出一个长类型。
  • 为什么不简单地将typename obj, typename ret 替换为class func,然后声明func f 并传递任何支持operator() 的内容,包括函数指针、函子等

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


【解决方案1】:

这可能与this 问题重复。

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

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

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

我不确定这是否适用于左侧的可变参数模板参数。但是它似乎编译得很好......

【讨论】:

  • 返回类型可以毫无问题地推导出来,你不需要重新排列任何东西,返回类型是参数定义的一部分
  • 是的,由于模板参数推导是从右到左进行的,而我的场景中无法推导出参数args,我需要它们作为第一个参数。
  • 您所链接的问题的答案指出“模板参数的顺序与扣除无关”。
  • 虽然“显式提供的模板参数只能从左到右提供”。因为args 在我的情况下必须是明确的,所以它必须先行。
  • @Matt 我不明白你想明确给出返回类型。无论如何,当传递指向成员函数的指针时,编译器可以毫无问题地推断出返回类型,并且顺序或模板参数也无关紧要,因为所有这些参数都是从单个参数中推断出来的。参数顺序很重要的唯一情况是显式传递它们或模板的推导依赖于另一个模板时,必须首先出现:coliru.stacked-crooked.com/a/9e01f64ed1bd51b3
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多