[英]How to initialize an array when using template<typename T> C++
通常,如果我有例如string array[10]
我可以初始化數組中的所有點,如:
for(int i = 0; i < 10; i++)
array[i] = "";
或者如果它是一個帶指針的數組,我會編寫array[i] = nullptr
,但是當類型更像T array[10]
時,我該如何初始化?
如果只需要值初始化,則可以使用空括號對所有數組成員進行值初始化:
T array[10]{};
// ^^
要么:
T array[10] = {};
值初始化為標量生成零值或空值,為聚合值初始化每個成員,並為非聚合類類型調用默認構造函數。
(如果要使用T{}
以外的值初始化數組元素,則需要更復雜和特定的內容。)
那么你可以像標准那樣做,並使用形式的初始化函數
template<typename T, std::size_t N>
void initialize(T (&arr)[N], const T& value = T())
{
for(auto& e : arr)
e = value;
}
現在你可以調用它,而不是傳遞一個值,並使用默認值初始化數組,或者你可以指定一個值,數組將用該值初始化。
如果您的目標是在數組的所有元素上調用默認構造函數,則可以使用值初始化:
#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.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.