在可变参数模板中构造固定大小的数组

时间:2014-10-10 22:04:05

标签: c++ c++11 variadic-templates

我想在可变参数函数中构造一个包含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);
}

但是有一种更简单的方法不依赖于这种额外的类型吗?

1 个答案:

答案 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);
}