【问题标题】:C++ template array size deductionC++模板数组大小推导
【发布时间】:2018-01-17 08:31:44
【问题描述】:

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

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

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

// 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 兼容。

【问题讨论】:

标签: c++ arrays templates


【解决方案1】:

简单

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

【讨论】:

  • 不编译。枚举 { SIZE = array_size(*t) }; 的“错误 C2101: '&' on constant”
  • 适用于 C++17 版本。 “参数的类型不能包含‘auto’”
  • 注意:我尝试将 C++ 标准设置为 C++17 进行编译
  • @JWellbelove:我添加了一个演示链接,该链接在 gcc 上有效(我有一个案例拼写错误)(但在 clang 上无效......)。你使用哪个编译器?
  • 也为 clang 找到了解决方法。
【解决方案2】:

C++11 在 type_traits 中引入范围

#include <type_traits>
std::extent<decltype(a)>::value

计算模板参数的数组大小。 见http://en.cppreference.com/w/cpp/types/extent

【讨论】:

  • 当我在模板类中使用它时,SIZE 总是定义为零。
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2012-06-07
  • 2014-12-24
相关资源
最近更新 更多