需要指针或向量参数
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);
}
}
}
我正在定义一个函数,使用模板将 "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);
}
}
}