如何在C ++中创建泛型函数(即基于模板)

时间:2013-07-23 13:35:58

标签: c++ templates generics

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

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;
    }

}

1 个答案:

答案 0 :(得分:1)

你没有指定你想要通用的东西,但我猜 类型(可能是尺寸)。 通常的创建方式 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;
    }
    //  ...
};

如果您不希望行和列是编译时间常量, 从模板参数中删除它们,并将它们添加到 构造函数参数。不要忘记保存它们。

一个更复杂(但仍然不太难)的解决方案 将使用代理类作为返回值 operator[],而不是T*。另一种常见的解决方案是 覆盖operator()( int i, int j )以进行索引,并使用 m( i, j )语法,而不是m[i][j]

永远不会在C ++中使用array new的任何原因。 C ++是 不是 C,你不应该试着像它那样编程。