需要指针或向量参数

Require pointer or vector argument

我正在定义一个函数,使用模板将 "points" 的 2d、1d 数组或向量写入文件。编译时报错"error C2109: subscript requires array or pointer type",提示变量"input"应该是数组或指针类型。但我只想实例化函数,如 follwoing

writers<Array_2d, 3, 4>(my2darray,1);

writers<std::vector<double>, 10, 1>(myvector,1);

Array_2d 是一个自定义的 class,因为我已经定义了 Array_2d 允许 [][] 运算符,它不应该告诉它是一个指针或数组任何。我该如何解决这个问题,因为我想通过定义明确的 [][] 运算符的 class 实例化该函数;

template <class item, int DIM1, int DIM2>
void writers(const item & input, int flag=1)
{
    using namespace std;
    ofstream fout;
    if (flag == 0)
    {
        fout.open(filename, std::ios_base::app);
    }
    else
    {
        fout.open(filename);
    }

    fout.setf(std::ios_base::floatfield, std::ios_base::fixed);
    fout.precision(8);
    for (int i = 0; i <DIM1; i++)
    {
        if (DIM2 > 1)
        {
            for (int j = 0; j < DIM2; j++)
            {
                fout.width(17);
                fout << input[i][j];
            }
            fout << "\n";
        }
        else
        {
            fout.width(17);
            fout << input[i];
        }
        fout << endl;
    }
    fout.close();
}

在 C++17 中,使用 if constexpr,你可能会做类似的事情:

template <typename Container>
void writers(const Container& input, ofstream& fout)
{
    if constexpr (std::is_same<double, typename Container::value_type>::value) {
        // 1D
        fout.setf(std::ios_base::floatfield, std::ios_base::fixed);
        fout.precision(8);
        for (auto& d : input) {
            fout.width(17);
            fout << d;
        }
        fout << endl;
    } else {
        // 2D (or 3D, ...)
        for (const auto& inner : input) {
            writers(inner, fout);
        }
    }
}