如何在使用模板<typename t =“”> C ++时初始化数组

时间:2016-04-27 12:11:06

标签: c++ c++11

通常情况下,如果我有string array[10],我可以初始化数组中的所有点,如:

for(int i = 0; i < 10; i++)
    array[i] = "";

或者如果它是一个带指针的数组,我改为编写array[i] = nullptr,但是如果类型更像T array[10]这样的类型,我该如何进行初始化?

3 个答案:

答案 0 :(得分:8)

如果只需要值初始化,则可以使用空括号对所有数组成员进行值初始化:

T array[10]{};
//         ^^

或者:

T array[10] = {};

值初始化为标量生成零值或空值,为聚合值初始化每个成员,并为非聚合类类型调用默认构造函数。

(如果要使用T{}以外的值初始化数组元素,则需要更复杂和特定的内容。)

答案 1 :(得分:4)

你可以像标准那样做,并以

的形式使用初始化函数
template<typename T, std::size_t N>
void initialize(T (&arr)[N], const T& value = T())
{
    for(auto& e : arr)
        e = value;
}

现在你可以调用它而不传递一个值,并且数组用默认值初始化,或者你可以指定一个值,数组将用该值初始化。

答案 2 :(得分:3)

如果您的目标是在数组的所有元素上调用默认构造函数,则可以使用值初始化:

#include <iostream>
#include <string>
#include <cassert>

template <typename T>
struct A {
  // value-initialize `array` which value-initializes all elements of `array`.
  A() : array() {}
  T array[10];
};

int main() {
    A<int> ints;

    for(auto e: ints.array) {
        assert(e == 0);
    }

    A<std::string> strings;

    for(auto e: strings.array) {
        assert(e.empty());
    }

    A<int*> int_ptrs;

    for(auto e: int_ptrs.array) {
        assert(e == nullptr);
    }

    // etc.
}