0
任何人都可以教我如何編寫一個模板函數,可以處理不同的數組維度1d,2d.is有可能嗎?如果可能的話給我一個例子初始化給定的數組1d或2d用零。模板函數來處理不同的數組維度和數據類型在C++
任何人都可以教我如何編寫一個模板函數,可以處理不同的數組維度1d,2d.is有可能嗎?如果可能的話給我一個例子初始化給定的數組1d或2d用零。模板函數來處理不同的數組維度和數據類型在C++
以下可能會有所幫助:
C++ 03:
template <typename T, std::size_t N>
void zero_array(T (&a)[N])
{
for (std::size_t i = 0; i != N; ++i) {
a[i] = 0;
}
}
template <typename T, std::size_t N1, std::size_t N2>
void zero_array(T (&a)[N1][N2])
{
for (std::size_t i = 0; i != N1; ++i) {
for (std::size_t j = 0; j != N2; ++j) {
a[i][j] = 0;
}
}
}
int main(int argc, char *argv[])
{
int a[42];
int b[42][2];
zero_array(a);
zero_array(b);
return 0;
}
C++ 11(任何尺寸):
#include <array>
template<typename T>
struct zero
{
void operator() (T& t) const { t = 0; }
};
template <typename T, std::size_t N>
struct zero<std::array<T, N>>
{
void operator() (std::array<T, N> &a) const
{
zero<T> z;
for (auto& e : a) {
z(e);
}
}
};
template <typename T>
void zero_array(T &a)
{
zero<T>()(a);
}
int main(int argc, char *argv[])
{
std::array<std::array<int, 42>, 2> a;
zero_array(a);
return 0;
}
事實上,這是很容易做到這一點:
C++ 11(對於任何尺寸!)
template< typename T >
void zero_out(T &cell)
{
cell = T();
}
template< size_t N, typename T >
void zero_out(T(&array)[N]) // this function is called recursively for each array dimension
{
for (auto & cell : array)
{
zero_out(cell);
}
}
void test()
{
static int array[2][3][4][5];
zero_out(array); // <--- zero out all the cells of our fourth-dimension array!
}
我認爲這對C++ 03也是可行的(避免使用'range-for'和'auto')。
爲什麼你需要一個功能?聲明數組時只需使用初始值設定項。 –