【发布时间】:2014-04-20 19:50:16
【问题描述】:
我想知道是否可以自动推断作为模板参数传递的数组的大小,而无需(显式)传递其大小。
以下代码均在 g++ 4.8 和 clang++ 3.3 上编译无警告(使用 -std=c++11 -Wall)。
#include <iostream>
template<const int* arr>
struct array_container
{
static constexpr int val = arr[1];
array_container() {
std::cout << val << std::endl;
}
// static constexpr int arr_size = ??;
};
constexpr int one[] = { 1 };
constexpr int two[] = { 1, 2 };
int main()
{
// array_container<one> array_one;
array_container<two> array_two;
// (void) array_one;
(void) array_two;
return 0;
}
但是,如果我删除 main() 中的两个注释符号,我会得到两个编译器的越界错误。
现在,这很酷。尽管const int* arr 的类型是指针,但编译器不知何故知道数组的大小。有没有办法获得 arr 的大小,例如在array_container 中完成我的评论?
当然,你是不允许的
- 使用任何宏
- 将大小存储在 arr 中(例如,将 std::array 作为模板参数传递:
constexpr std::array<int, 1> one = { 1 },或在字符串中使用像'\0'这样的结束标记) - 使用一个额外的模板参数来表示不能自动推断出的尺寸 (
array_container<1, one> array_one)。
【问题讨论】:
-
真的是编译器给你一个错误,还是运行时错误(崩溃)?
-
@JoachimPileborg 确实是编译器。我什至无法编译这个程序。
-
你想做什么?
-
@Jefffrey 编辑:我想通过仅传递数组而不是(显式)传递数组大小来自动推断大小。
-
我不认为
array_container<decltype(arr_a), arr_a>::size可以接受? :p