当前位置: 首页 > 知识库问答 >
问题:

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

柯捷
2023-03-14
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

共有1个答案

呼延修然
2023-03-14

在芬兰奥卢举行的ISO C++2016会议上,模板 特性(P0127R1)被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>;
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>;
template <typename T, T ... vs> struct Cxx14HomogenousValueList {};
using MyList3 = Cxx14HomogenousValueList<int, 1, 2, 3>;
template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {};
using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>,
                                           constant<char, 'X'> >;
 类似资料:
  • 根据https://gcc.gnu.org/projects/cxx-status.html,g的第7版,与标志一起使用,支持类模板的模板参数推断。 我希望编译以下代码,特别是因为是一个抽象类: 1。编译器知道不能创建的实例 2。指向base的指针指向一个明确定义的实例(即

  • 我正在学习C 17非类型模板参数的新功能。我编写了一个简单的代码片段,如下所示: 据我所知,福 但是,语句使用clang、MSVC 19.27编译,但在GCC 10.2、MSVC 19.25编译时失败。 我的问题是:为什么编译器的行为不同?标准对此有何规定? 链接到编译器资源管理器: 叮当声https://godbolt.org/z/66M695 海湾合作委员会https://godbolt.or

  • 我发现gcc和clang允许在非类型模板参数类型子句中使用。例如: [live demo gcc][live demo clang] 它是符合标准的功能还是一些gnu扩展?

  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp

  • 以下程序在C 20中编译良好: 但在C 17中,它会产生一个错误: 你能告诉我C20有什么变化让它工作吗?