gpt4 book ai didi

c++ - 获取数组指针模板参数的大小

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:04 27 4
gpt4 key购买 nike

我想知道我是否可以自动推断数组的大小,它作为模板参数传递,而不(显式)传递其大小。

以下代码在 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)。

最佳答案

也许 std::extent模板来自 <type_traits> C++11 标准库的头文件就是你想要的:

#include <iostream>
#include <type_traits>

constexpr int one[] = { 1 };
constexpr int two[] = { 1, 2 };

int main()
{
std::cout << std::extent<decltype(one)>::value << std::endl;
std::cout << std::extent<decltype(two)>::value << std::endl;

return 0;
}

输出:

1
2

关于c++ - 获取数组指针模板参数的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com