我目前正在学习c ++中的模板元编程,并偶然发现变量模板。作为一个有趣的练习,我决定使用以下用法实现编译时静态数组 -
my_array<1,2,3,4> arr; // gives an array with 4 members = 1,2,3,4
我已经尝试了几次迭代尝试,一路上删除了语法错误,但现在我被卡住了,因为没有编译器提供有用的警告。这是我目前的代码 -
#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;
}
但目前它使用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.
和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;
我应该如何继续实施这个东西(最好使用变量模板,因为我知道这可以用旧的结构技术实现)。
答案 0 :(得分: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;
}
输出:
1
答案 1 :(得分:2)
你的意思是做一个类型吗?
#include <stdexcept>
template < size_t... Enteries >
class my_array
{
constexpr static size_t const N = sizeof...(Enteries);
constexpr static size_t const value[N] = {Enteries...};
public:
constexpr size_t operator[](size_t idx) const
{
if ( idx < N )
return value[idx];
else
throw std::out_of_range("my_array index out of range");;
}
};
int main() {
my_array<1,2,3,4,5,6> arr;
static_assert( arr[0] == 1, "!" );
static_assert( arr[1] != 5, "!!" );
//static_assert( arr[9] == 0, "!!!" ); // Does not compile
}
答案 2 :(得分:1)
编译时数组有几种方法
constexpr
只需使用constexpr
constexpr size_t arr[] = {3, 2, 1};
template<size_t... E>
constexpr size_t arr[] = {E...};
这称为variable template,arr
是变量,因此您可以像使用
for(auto i : arr<42, 420, 4200>)
std::cout << i << std::endl;
此功能已在C ++ 14中提供,即std::integer_sequence
。这不像简单数组那么简单,主要用于需要数字参数包时
template<typename T, T... I>
void print(std::integer_sequence<T, I...>)
{
(std::cout << ... << I); // fold expression from C++1z, parentheses required
}
print(std::integer_sequence<size_t, 1, 2, 3>{});