C ++中模板参数的自动优势17

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 

我还从这个语言function中获得了什么?

在芬兰Oulu的ISO C ++ 2016会议上, template <auto>function( P0127R1 )被C ++接受。

模板参数中的auto关键字可用于指示在实例化时推导出的types的非types参数。 这有助于把这看作是一种更方便的写作方式:

 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>; 

你不需要再明确地说明这个types。 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>; 

在pre-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(原始)答案中的实际值的情况明确地不被覆盖为非types的模板参数。

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

请参阅上述提议中的示例:修改第14.3.2段的第2段:

 template<auto n> struct B { /* ... */ }; B<5> b1; // OK: template parameter type is int B<'a'> b2; // OK: template parameter type is char B<2.5> b3; // error: template parameter type cannot be double 

就在几天前,我自己也发现了同样的错误观念。