根据参数类型获取匹配的重载

时间:2017-06-23 21:36:33

标签: c++ templates overloading

我的目标是创建带有函数和参数列表的函数并返回该函数签名。一开始听起来很简单但主要用于帮助识别为特定参数选择哪个函数重载,模板对我来说没有用。我已经在堆栈上找到了允许我打印任何变量类型的代码,但是获得指向匹配重载的指针是另一回事。 我的第一次尝试如下:

template<typename F, typename... Args>
auto sig(F f, Args... args) -> decltype(f(std::forward<Args>(args)...), void()) {
    std::cout << get_name<decltype(f)>() << '\n';
}

它可以工作......只要函数没有重载。例如:

void foo(bool) {}
void fun(double&&) {}
void fun(int&&) {}

使用这些功能我可以做到

sig(foo, true);

但不是

sig(fun, 5.5);

经过一些谷歌搜索后,我来了

template<typename... A>
using sign = decltype(fun(std::declval<A>()...))(*)(A...);

它需要一些宏来处理任何功能(现在有趣的是硬编码),但没关系。问题是它基本上只检查IF是否存在匹配的重载,并且返回的签名仅对返回类型是正确的。

在这一点上,我完全不知道接下来会尝试什么,而我的google-fu失败了。我很感激一些帮助。 Here is link to wandbox if anyone wants to play with what is already done.

1 个答案:

答案 0 :(得分:1)

#define RETURNS(...) \
  noexcept(noexcept(__VA_ARGS__)) \
  -> decltype(__VA_ARGS__) \
  { return __VA_ARGS__; }

#define OVERLOADS_OF(...) \
  [](auto&&...args) \
  RETURNS( __VA_ARGS__( decltype(args)(args)... )

现在,

 sig(OVERLOADS_OF(fun), 5.5);

做你想做的事。

post-C++17 proposal将此简化为

#define OVERLOADS_OF(...) \
  [](auto&&...args) =>  __VA_ARGS__( decltype(args)(args)... )

 sig([](auto&&x)=>fun(decltype(x)(x)), 5.5);

甚至更简短的变体。