【发布时间】:2016-05-01 20:14:54
【问题描述】:
我有一个矩阵模板类,我需要一个函数来设置它的元素与可变数量的参数。
我应该可以这样称呼它:
aghMatrix<string> matrix;
matrix.setItems(2, 3, "torzmiae", "jestdnaci", "tablickore", "wyrazobed", "oelmntai", "rozmiaecy");
第一个整数是行数,第二个是列数,其余 (R * C) 参数是我应该放入矩阵的元素。
它应该适用于任何数据类型,而不仅仅是原始数据类型。
目前,我的函数如下所示:
template<typename T>
template<typename... ARGS>
void aghMatrix<T>::setItems(const int rows, const int cols, ARGS... args) {
array<T, sizeof...(args)>unpacked_args {args...};
int row = 0;
int col = 0;
for (T arg : unpacked_args)
{
this->matrixPtr[row][col] = arg;
col++;
if (col == this->cols) {
row++;
col = 0;
}
}
return;
}
我假设我的矩阵对象能够容纳所有元素。它确实在编译时带有许多关于将所有内容转换为 unsigned int 的警告,但程序无论如何都无法运行(它在启动时冻结)。
类声明:
template<typename T>
class aghMatrix {
public:
[...]
template<typename... ARGS> void setItems(const int rows, const int cols, ARGS... args);
[...]
private:
T **matrixPtr;
int rows;
int cols;
void createMatrix(const int row, const int col);
bool checkRowCol(const int row, const int col) const;
};
【问题讨论】:
-
array<size_t, sizeof...(args)>是一个仅包含size_t元素的数组。你想把"torzmiae"放在那里?不会工作。 -
我并不是说我的解决方案很好。这只是我在 SO 上找到的东西。如果您有更好的方法来解决我的问题,我很乐意尝试使用它。
-
请给我们看一个更完整的例子。我们看不到
matrixPtr是如何初始化的,所以无法调试。访问stackoverflow.com/help/mcve -
如果
matrixPtr是std::string**类型,那么所有这些指针指向什么?您取消引用未初始化的指针,即 UB。 -
std::initializer_list 怎么样?对我来说,可变参数模板在类型不同时很有用,但在你的情况下,它们都具有相同的类型,所以我认为数组更合适。
标签: c++ function templates matrix variadic