【问题标题】:How to infer the template parameter from instantiation of function template?如何从函数模板的实例化推断模板参数?
【发布时间】: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> > {
      |                   ^~~~~~~

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

【问题讨论】:

  • 有趣的是,我以前从来不需要这样做。目的是什么?不过我敢打赌,一般来说这是不可能的。
  • @PasserBy 我不得不承认我手头没有用例。它是由这个问题stackoverflow.com/q/65491395/4117728触发的。在我的回答中我首先写了“你不能使用未命名的模板参数”,然后我意识到它可以被推断出来,然后我意识到我不知道在函数模板的情况下如何推断它
  • “我确实理解错误”,不是我 ;-)
  • 请注意,gcc 会错误地拒绝来自 temp.class.spec#match-3 的示例,并带有相同的错误消息 Demo
  • @Jarod42 老实说我不明白这个错误;)。这是我的说法,“不要太在意它,我需要别的东西”。同时,我认为问题在于&amp;bar&lt;T&gt;s 类型取决于T(即使实际上它不是)。 Clangs 错误消息更有意义godbolt.org/z/3YvEx1

标签: c++ templates function-templates


【解决方案1】:

我不认为你想要什么。

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

您可以通过简单的static_assert() 验证这一点

static_assert( std::is_same_v<decltype(bar<int>), decltype(bar<long>)> );

【讨论】:

  • 我知道我忽略了一些东西,只是预计它会朝相反的方向发展;)
  • @largest_prime_is_463035818 - 是的...是一个有趣的问题。
  • 指向实例化的指针不同,因此可以对特定类型或一组类型进行测试,但这相当有限
  • 问题是“只是”部分专业化,完全专业化,it works。非类型模板参数比类型模板参数有更严格的规则,但我在这里找不到它违反的规则:-/
猜你喜欢
  • 2010-09-18
  • 2012-04-18
  • 1970-01-01
  • 2019-09-12
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多