如何从函数模板的实例化中推断出模板参数?

How to infer the template parameter from instantiation of function template?

我知道如何从 class 模板的实例化中推断模板参数:

template <typename T>
struct foo {};

template <typename T>
struct foo_param;

template <typename T>
struct foo_param< foo<T> > {
    using type = T;
};

但是我对函数模板做同样的事情感到迷茫。幼稚

template <typename T>
void bar() {}

template <auto F>
struct bar_param;

template <typename T>
struct bar_param< &bar<T> > {
    using type = T;
};

失败

<source>:21:19: error: template argument '& bar<T>' involves template parameter(s)
   21 | struct bar_param< &bar<T> > {
      |                   ^~~~~~~

我想我确实理解了这个错误(实际上我没有理解,但那是另一个问题的情况),但我不知道如何避免它。我如何推断 int 给定 &bar<int>

我不认为你想要什么。

不传递函数的类型,至少,因为 bar<T> 的类型对于每种类型都是完全相同的:返回的 void 函数没有参数。

您可以通过简单的 static_assert()

来验证这一点
static_assert( std::is_same_v<decltype(bar<int>), decltype(bar<long>)> );