我想在可变函数中构造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/

10-11 23:02