我想在可变参数函数中构造一个包含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);
}
但是有一种更简单的方法不依赖于这种额外的类型吗?
答案 0 :(得分:2)
只需使用其他模板:
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);
}