Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++_Templates_Generics - Fatal编程技术网

如何在C++中实现泛型这个功能(即基于模板的)

如何在C++中实现泛型这个功能(即基于模板的),c++,templates,generics,C++,Templates,Generics,我使用gcc版本4.6.3。我想实现一个函数来分配二维矩阵并初始化它们。我使用了以下代码,但我想要一个基于模板的或通用的代码。我想要一个通用函数来同时处理bool、float和double。在所有情况下,这个过程都是相似的。你能帮我一下吗,或者给我介绍一种更好的分配2d矩阵的方法 void doubleAlloc2D(double ** &t, int r, int c,double initialValue=0) { t=new double*[r]; if (!t)

我使用gcc版本4.6.3。我想实现一个函数来分配二维矩阵并初始化它们。我使用了以下代码,但我想要一个基于模板的或通用的代码。我想要一个通用函数来同时处理bool、float和double。在所有情况下,这个过程都是相似的。你能帮我一下吗,或者给我介绍一种更好的分配2d矩阵的方法

void doubleAlloc2D(double ** &t, int r, int c,double initialValue=0)
{
    t=new double*[r];
    if (!t)
    {
        if (DETAILS) std::printf  ("Not enough memory.(code: 461546596551)\n");
        getchar();
        exit(-1);
    }

    for (int i=0;i<r;i++)
    {
        t[i] = new double[c];
        if (!t[i])
        {
            if (DETAILS) std::printf  ("Not enough memory.(code: 461651651)\n");
            getchar();
            exit(-1);
        }
        for (int j=0;j<c;j++)
            t[i][j] = initialValue;
    }

}

你没有具体说明你想要什么是通用的,但我猜 类型和可能的尺寸。通常的创建方法 包含容器的对象,无论是C++还是泛型,都是定义它的。 作为一个班级。比如:

template <typename T, int rows, int columns>
class Matrix
{
    std::vector<T> myData;
public:
    Matrix( T const& init = T() )
        : myData( rows * columns, init )
    {
    }
    T* operator[]( int index )
    {
        return &myData[0] + index * columns;
    }
    T const* operator[]( int index ) const
    {
        return &myData[0] + index * columns;
    }
    //  ...
};
如果不希望行和列成为编译时常量, 从模板参数中删除它们,然后将它们添加到 构造函数参数。别忘了救他们

一个稍微复杂但仍然不太难的解决方案 将使用代理类作为 运算符[],而不是T*。另一个常见的解决方案是 重写用于索引的运算符int i、int j,并使用 mi,j语法,而不是m[i][j]

<>在C++中没有任何理由使用数组new。C++是
不是C,您不应该试图将其编程为C。

什么是通用的?任何类型而不是双精度?使用std::vector。然后它会自动泛型,函数会变得冗余。new在内存不足时抛出,它不会返回null。除非你在一个古老的编译器上,否则我会远离模板。模板STD::vector alOnt2Dint t,int c,t初始化值= t{返回:STEC::VECRTRR,STD::VECCORTC,IMAGINALVALL;} OMG C++代码可以这么短!我喜欢那些错误代码!请你介绍我一本书,我可以了解更多关于6和第七行,矩阵T const和init=t:MyDeaStudio*列,init @ ReMo,只是关于任何C++入门课程应该涵盖它。两个非常好的编程:原理和实践,Bjarne Stroustrup为初学者,加速C++,Andy Koenig和Barbara Moo为更高级程序员。