【问题标题】:Insert array data into template将数组数据插入模板
【发布时间】:2016-01-22 21:03:07
【问题描述】:

我想用数组中的一些整数填充模板,但这在 C++ 中似乎是不允许的。一个例子:

我用整数定义了一个常量数组。

const int array[4] = {0, 1, 2, 3};

我的模板是这样工作的:

template<int T> TestClass ...

在下面,第一种方式没问题,但是第二种方式编译不了:

TestClass<12> ...          // works
TestClass<array[0]> ...    // does not work

编译器说在模板中不允许使用运算符“[”。但这是什么原因,我该如何优雅地解决这种情况?是否也可以使用for-loop 的计数器i 来选择数组的整数,例如:

TestClass<array[i]>

【问题讨论】:

  • c 中没有模板,所以不要将问题标记为c
  • 对不起,太快了!你是对的。
  • 再试一次,使用constexpr数组和正确的语法(不是括号来实例化模板)。

标签: c++ arrays templates constants


【解决方案1】:

将您的数组转换为constexpr 变量:

constexpr int array[4] = {0, 1, 2, 3};

甚至更好:

constexpr std::array<int, 4> myArray{0, 1, 2, 3};

由于您的数组将是constexpr,因此它的用法将在编译时有效。

请务必为std::array 版本启用c++14。

【讨论】:

  • 这很有趣。编辑器仍然标记一个错误但它编译(为什么?)当我现在尝试使用计数器 i 在 for 循环中声明模板时,它不会编译:TestClass&lt;array[i]&gt; 有没有技巧好吗?
  • 您的变量i 也必须是constexpr。由于不能有constexpr 函数参数,所以必须有i 作为模板参数。
  • 但我无法在 for 循环中增加 常量计数器变量 i...?
【解决方案2】:

模板TestClass ...中的整数类型模板参数(例如int)应该是编译时间常量,这就是此类代码无法编译的原因。

【讨论】:

  • 但是数组被声明为常量。是不是编译时间常数?如何在模板中使用一些排列整齐的整数(来自数组)?
  • 要使其成为编译时间常数,您应该将其声明为 constexpr
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2019-06-19
相关资源
最近更新 更多