我想在可变函数中构造8个整数的数组。没问题:
template <typename... Ints>
void foo(Ints... ints) {
static_assert(sizeof...(Ints) < 8, "some useful error");
const int my_array[8] = {ints...};
}
甚至会自动将数组初始化为零,因此,如果我调用
foo(1, 2, 3)
,我将得到一个类似于{1, 2, 3, 0, 0, 0, 0, 0}
的数组。现在,如果我想默认为非零值怎么办?就像-1。这有效:
template <int Def>
struct Int {
Int() : val(Def) { }
Int(int i): val(i) { }
inline operator int() const { return val; }
int val;
};
template <typename... Ints>
void foo(Ints... ints) {
const Int<-1> my_array_def[8] = {ints...};
const int* my_array = reinterpret_cast<const int*>(my_array_def);
}
但是,有没有更简单的方法不依赖于这种额外类型呢?
最佳答案
只需使用另一个模板:
template <typename... Ints>
auto foo(Ints... ints) -> typename std::enable_if<sizeof...ints==8>::type {
const int my_array[] = {ints...};
}
template <typename... Ints>
auto foo(Ints... ints) -> typename std::enable_if<sizeof...ints<8>::type {
return foo(ints..., -1);
}
关于c++ - 在可变参数模板中构造固定大小的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26308716/