如何从函数模板的实例化中推断出模板参数?
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>)> );
我知道如何从 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>)> );