Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板函数,用于处理c+中的不同数组维度和数据类型+;_C++_Arrays_Templates_Vector - Fatal编程技术网

C++ 模板函数,用于处理c+中的不同数组维度和数据类型+;

C++ 模板函数,用于处理c+中的不同数组维度和数据类型+;,c++,arrays,templates,vector,C++,Arrays,Templates,Vector,有谁能教我如何编写一个模板函数来处理不同的数组维数1d,2d。有可能吗?如果可能,请给出一个用零初始化给定数组(1d或2d)的示例。以下内容可能会有所帮助: 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 <typen

有谁能教我如何编写一个模板函数来处理不同的数组维数1d,2d。有可能吗?如果可能,请给出一个用零初始化给定数组(1d或2d)的示例。

以下内容可能会有所帮助:

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;
}
模板
无效零数组(T&a)[N])
{
对于(std::size\u t i=0;i!=N;++i){
a[i]=0;
}
}
模板
空零阵列(T&a)[N1][N2])
{
对于(标准::大小\u t i=0;i!=N1;++i){
对于(标准:尺寸j=0;j!=N2;++j){
a[i][j]=0;
}
}
}
int main(int argc,char*argv[])
{
INTA[42];
int b[42][2];
零u阵列(a);
零u阵列(b);
返回0;
}
C++11(任何维度):

#包括
模板
结构零
{
void运算符()(T&T)常量{T=0;}
};
模板
结构零
{
void操作符()(std::array&a)const
{
零z;
适用于(自动和电气:a){
z(e);
}
}
};
模板
空零阵列(T&a)
{
零()(a);
}
int main(int argc,char*argv[])
{
std::数组a;
零u阵列(a);
返回0;
}

事实上,这很容易做到:

c++11(适用于任何维度!)

模板
无效零输出(T和cell)
{
细胞=T();
}
模板
void zero_out(T(&array)[N])//对每个数组维度递归调用此函数
{
用于(自动单元格:阵列(&C)
{
零输出(单元);
}
}
无效测试()
{
静态整数数组[2][3][4][5];

zero_out(array);//为什么需要函数呢?声明数组时只需使用初始值设定项即可。
#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;
}
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!
}