【问题标题】:Deduce function type of overloaded function based on argument types根据参数类型推断重载函数的函数类型
【发布时间】:2014-03-18 21:48:59
【问题描述】:

假设有一个重载函数:

void overloaded(int) {}
void overloaded(void) {}

因为我不想(或不能)写下完整的函数签名(如 void(int)void(void)),我需要仅使用函数名称(overloaded)来获取此签名,并且 它的参数类型(intvoid)。

我使用decltype和朋友尝试了几种方法,但不幸的是没有成功。

所以,简而言之,我需要这样的东西:

cout << typeid(
  get_overload(overloaded,(int)0))::type /* where the magic happens */
  .name() << endl;

【问题讨论】:

  • 这和stackoverflow.com/questions/21738775/…之间的唯一区别是对方想推断然后存储在std::function中,所以那里的答案(大部分)适用于这个答案
  • 但是和其他答案一样,我不确定为什么你认为你需要这个。为什么不能写完整的函数签名?

标签: c++ templates c++11 overloading overload-resolution


【解决方案1】:

如果允许您在 type 函数中使用名称 overloaded,则可以这样做:

template<typename... A>
using sig = decltype(overloaded(std::declval<A>()...))(A...);

sig&lt;int&gt; 给出void(int)sig&lt;&gt; 给出void()

这只是模板别名中 tclamb 解决方案的包装。

【讨论】:

  • 请注意,即使在不完全匹配的情况下,这也可以工作(我不知道这是否是有意的 - OP 说“参数类型”,但随后给出了参数类型......)。例如,如果A&lt;long&gt;,您的调用仍然成功,但sig&lt;long&gt;void(long),这不是确切的类型。
  • 对,我想这就是你的答案。
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2018-08-28
相关资源
最近更新 更多