问题描述
我知道如何从类模板的实例中推断模板参数:
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>)> );