C 17中模板参数中auto的优点

新手上路,请多包涵

auto 在将(可能)与 C++17 一起引入的模板参数中的优点是什么?

当我想实例化模板代码时,它只是 auto 的自然扩展吗?

 auto v1 = constant<5>;      // v1 == 5, decltype(v1) is int
auto v2 = constant<true>;   // v2 == true, decltype(v2) is bool
auto v3 = constant<'a'>;    // v3 == 'a', decltype(v3) is char

我还能从这个语言功能中获得什么?

原文由 Damian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 668
1 个回答

template <auto> 特性 ( P0127R1 ) 在芬兰奥卢举行的 ISO C++ 2016 会议上被 C++ 接受。

模板参数中的 auto 关键字可用于指示非类型参数,其类型在实例化点推导出。将其视为一种更方便的写作方式会有所帮助:

 template <typename Type, Type value>

例如,

 template <typename Type, Type value> constexpr Type constant = value;
constexpr auto const IntConstant42 = constant<int, 42>;

现在可以写成

template <auto value> constexpr auto constant = value;
constexpr auto const IntConstant42 = constant<42>;

您不再需要明确说明类型。 P0127R1 还包括一些简单但很好的例子,其中使用 template <auto> 和可变参数模板参数非常方便,例如编译时列表常量值的实现:

 template <auto ... vs> struct HeterogenousValueList {};
using MyList1 = HeterogenousValueList<42, 'X', 13u>;

template <auto v0, decltype(v0) ... vs> struct HomogenousValueList {};
using MyList2 = HomogenousValueList<1, 2, 3>;

在 C++1z 之前的版本中, HomogenousValueList 可以简单地写成

template <typename T, T ... vs> struct Cxx14HomogenousValueList {};
using MyList3 = Cxx14HomogenousValueList<int, 1, 2, 3>;

如果不将值包装在其他一些模板中,则无法编写 HeterogenousValueList 的等价物,例如:

 template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {};
using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>,
                                           constant<char, 'X'> >;

原文由 mceo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题