C++模板数组大小推导

标签 c++ arrays templates

我正在尝试为编译器设计一种方法来推断作为非类型模板参数传递的数组的大小。

如果我明确地将数组大小作为第三个模板参数传递,我可以使模板工作,但这会使该技术出错。

任何人都可以想出一种方法来做到这一点。 下面的代码无法编译,但它给出了我要实现的目标的想法。

// Compile time deduction of array size.
template <typename T, const size_t SIZE>
char(&array_size(T(&array)[SIZE]))[SIZE];

#define ARRAY_SIZE(x) (sizeof(array_size(x)))

template <typename T, T BEGIN[]>
struct Test
{
  enum
  {
    SIZE = ARRAY_SIZE(BEGIN)
  };
};

int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int main()
{
  Test<int, a> test;

  return 0;
}

[编辑] 我忘了指出该解决方案还必须与 C++03 兼容。

最佳答案

简单

template <typename T, std::size_t N>
constexpr std::size_t array_size(const T(&)[N]) { return N; }

在 C++17 中,你可以这样做

template <auto V>
struct Test
{
    enum { SIZE = array_size(*V) };
};

Test<&a> test;

Demo

之前,你可能会做的比较冗长

template <typename T, T t>
struct Test
{
    enum { SIZE = array_size(*t) };
};

Test<decltype(&a), &a> test;

Demo (适用于 gcc 但不适用于 clang :-/)

也适用于 clang 的版本:

template <typename T, std::size_t N>
constexpr std::integral_constant<std::size_t, N> array_size(const T(&)[N]) { return {}; }

template <typename T, T V>
struct Test
{
    enum { SIZE = decltype(array_size(*std::declval<T>()))::value };
};

Demo

关于C++模板数组大小推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296673/

相关文章:

c++ - 在函数入口处将字符串添加到记录器

javascript - 在 Javascript 数组中使用 indexOf()

用于 sql 查询的 Php 表模板

c++ - 在模板类中声明与 friend 相同的模板类?

c++ - 模板函数类型推导和返回类型

c++ - 如何编写QVector fo txt文件

c# - 在 C# 中从 C++ 代码中获取对象功能

ios - 如何为不同的 UTableView 部分使用不同的 segues 并传递数据

c++ - 在 Linux 中使用 C++ 实现低开销间隔定时器

javascript - 用字符串填充数组的最佳方法