【发布时间】:2020-12-29 16:58:50
【问题描述】:
我知道如何从类模板的实例中推断模板参数:
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> > {
| ^~~~~~~
我想我确实理解了这个错误(实际上我没有理解,但这是另一个问题的情况),但我不知道如何避免它。给定&bar<int>,我如何推断例如int?
【问题讨论】:
-
有趣的是,我以前从来不需要这样做。目的是什么?不过我敢打赌,一般来说这是不可能的。
-
@PasserBy 我不得不承认我手头没有用例。它是由这个问题stackoverflow.com/q/65491395/4117728触发的。在我的回答中我首先写了“你不能使用未命名的模板参数”,然后我意识到它可以被推断出来,然后我意识到我不知道在函数模板的情况下如何推断它
-
“我确实理解错误”,不是我 ;-)
-
请注意,gcc 会错误地拒绝来自 temp.class.spec#match-3 的示例,并带有相同的错误消息 Demo。
-
@Jarod42 老实说我不明白这个错误;)。这是我的说法,“不要太在意它,我需要别的东西”。同时,我认为问题在于
&bar<T>s 类型取决于T(即使实际上它不是)。 Clangs 错误消息更有意义godbolt.org/z/3YvEx1
标签: c++ templates function-templates