变量模板编译时间数组

hg_*_*git 2 c++ templates template-meta-programming variadic-templates c++14

我目前正在学习c ++中的模板元编程,并偶然发现变量模板.作为一个有趣的练习,我决定使用以下用法实现编译时静态数组 -

my_array<1,2,3,4> arr;  // gives an array with 4 members = 1,2,3,4
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几次迭代尝试,一路上删除语法错误,但现在我卡住了,因为没有编译器提供有用的警告.这是我目前的代码 -

#include <iostream>

template<size_t... Enteries>
constexpr size_t my_array[sizeof...(Enteries)] = {Enteries...};

int main() {
    my_array<1,2,3,4,5,6> arr;
}
Run Code Online (Sandbox Code Playgroud)

但目前它与clang给出以下错误 -

static_array.cpp:7:10: error: expected ';' after expression
        my_array<1,2,3,4,5,6> arr;
                ^
                ;
static_array.cpp:7:24: error: use of undeclared identifier 'arr'
        my_array<1,2,3,4,5,6> arr;
                              ^
static_array.cpp:7:2: warning: expression result unused [-Wunused-value]
        my_array<1,2,3,4,5,6> arr;
        ^~~~~~~~~~~~~~~~~~~~~
1 warning and 2 errors generated.
Run Code Online (Sandbox Code Playgroud)

和gcc -

static_array.cpp: In function ‘int main()’:
static_array.cpp:7:24: error: expected ‘;’ before ‘arr’
  my_array<1,2,3,4,5,6> arr;
                        ^~~
static_array.cpp:7:27: warning: statement has no effect [-Wunused-value]
  my_array<1,2,3,4,5,6> arr;
Run Code Online (Sandbox Code Playgroud)

我应该如何继续实现这个东西(最好用变量模板,因为我知道这可以用旧的struct技术实现).

sky*_*ack 5

正如对问题的评论中所提到的,my_array<1,2,3,4,5,6>不是一种类型.my_array是一个变量模板,它有一个你可以使用的类型,但它不是一个类型,你不能按照你的方式使用它.
您不能声明具有类型的变量my_array<1,2,3,4>,但您可以使用该变量my_array<1,2,3,4>.举个例子,你想获得第N个元素吗?my_array<1,2,3,4,5,6>[N];.

示例程序:

#include <iostream>

template<size_t... Enteries>
constexpr size_t my_array[sizeof...(Enteries)] = {Enteries...};

int main() {
   std::cout << my_array<1,2,3,4,5,6>[0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)