【问题标题】:Auto deducing a type template argument from a dependent non-type template argument从依赖的非类型模板参数自动推导类型模板参数
【发布时间】:2018-05-01 21:38:35
【问题描述】:

我这样定义了一个类模板X

template <typename T>
using Func = void(T);

template <typename T, Func<T> F>
class X { ... };

现在我可以像这样使用X 类:

void func(int i);

X<int, &func> x;

x 的声明中重复int 类型对我来说似乎是多余的。有没有办法可以自动推断?我的意思是我想要一个类型模板Y,它可以通过Y&lt;&amp;func&gt; 使用,等于X&lt;int, &amp;func&gt;,自动推导出int

我尝试了很多,甚至定义了疯狂的模板函数并使用decltype,但似乎没有办法在命名&amp;func之前删除T

更新:我使用 MSVC 2017.5 似乎是一个限制,这使我无法按照 Kerrek 的建议在模板参数列表中使用 auto。我想知道是否有一些“hack”可以在没有此功能的情况下获得相同的效果。

【问题讨论】:

  • 在 C++17 之前使用的典型“hack”人涉及一个辅助函数声明、decltype 和一个宏。

标签: c++ templates c++17


【解决方案1】:

当然,使用 auto 并部分专门化:

template <auto F> struct X;

template <typename T, void (*F)(T)> struct X<F>
{
    // ...
};

用法:

void f(int);

X<f> x;   // deduces T = int, F = f in the partial specialization

【讨论】:

  • 这太棒了。但似乎我的编译器(MSVC 2017.5)不支持模板参数列表中的 auto 。它给出了 C3533。
  • @M.Winter:您没有在问题中指定该限制。
  • @M.Winter:你是用“c++1z”标记问题的人。如果您不是那个意思,请更改您的标签?
  • @M.Winter:向您的供应商投诉虚假广告 :-)
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多