【发布时间】:2018-07-06 05:42:17
【问题描述】:
我想使用新的 C++ 范例对一个小型数学库进行现代化改造(我有一个 C++17 编译器)。具体来说,我需要通过构造函数将一个数组传递给一个类。
这是我使用的“经典”旧方式。有效
class Vector {
public:
long double* elements;
public:
Vector(int size, long double *array) {
elements = new long double[size];
for(int i = 0; i < size; i++) {
elements[i] = array[i];
}
};
virtual ~Vector() {
delete []elements;
}
};
int main() {
long double array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
Vector vector = Vector(10, array);
for (int i = 0; i < 10; i++) {
std::cout << vector.elements[i] << std::endl;
}
return 0;
}
所以,我尝试用我对可变参数模板和参数包的理解来更改 Vector 类。它不起作用
class Vector {
public:
long double* elements;
public:
template<typename... Args>
Vector(Args... args){
constexpr int size = sizeof...(Args);
elements = new long double[size]{args...};
}
};
int main() {
long double array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
Vector vector = Vector(array);
for (int i = 0; i < 10; i++) {
std::cout << vector.elements[i] << std::endl;
}
return 0;
}
编译器返回的错误是
错误:初始化时无法将“long double*”转换为“long double”
elements = new long double[size]{args...};
我做错了什么? 此外,我想知道是否可以在 main 方法和 Vector 类中使用 std::array 而不是原始数组。
【问题讨论】:
-
模板在编译时扩展,它不会用它的初始化列表替换
array。 -
请使用
std::array而不是这些糟糕的 c 样式数组! -
将
std与一个名为Vector的类和一个名为vector的变量一起使用可能是一个非常糟糕的主意。 (见std::vector) -
您正在使用
new,这是一个非常糟糕的选择。您也不遵守零规则,因此您的Vector将在即使是简单的情况下也会中断。只需使用std::vector。 -
@TheDude 好的,这似乎是个好主意。其实我不想用c-style。但是,如何在不使用循环初始化内部 std :: 数组 的情况下通过构造函数传递 std :: 数组?它与模板和参数包的存在方式不同吗?
标签: c++ arrays c++11 constructor variadic-templates