C++ 如何将数组类型的动态对象传递给函数?
我想将动态大小标准和typename类型数组传递给函数 我不知道怎么做。为什么我不能接受对对象数组的引用 我尝试的代码:C++ 如何将数组类型的动态对象传递给函数?,c++,arrays,C++,Arrays,我想将动态大小标准和typename类型数组传递给函数 我不知道怎么做。为什么我不能接受对对象数组的引用 我尝试的代码: #include <iostream> #include <array> using namespace std; template <typename T> void showArrays(void *myArrayPointer, int size, T type) { array<T, size> myArra
#include <iostream>
#include <array>
using namespace std;
template <typename T>
void showArrays(void *myArrayPointer, int size, T type) {
array<T, size> myArray = myArrayPointer;
for (int i = 0; i < size; i++) {
cout << myArray.at(i) << " \n";
}
}
int main()
{
array<int,6> myArray = { 1,2,3,4,5,6 };
cout << "The array is \n";
showArrays(&myArray,6,0);
return 0;
}
但我仍然得到了大小的预期编译时常量表达式。
我的函数头也不是很漂亮。但是,如果不传递通用指针或创建类数组的模板(其中大小是一个属性),我无法找到一种使大小动态的方法。这里根本没有理由使用void*。std::数组的元素类型和大小在编译时是已知的,您可以使用模板捕获它们
template<typename T, std::size_t N>
void print_arry(const std::array<T, N>& arr)
{
for (const auto& e : arr)
std::cout << e << "\n";
}
如果您想要一个函数模板,其中类型是模板参数,但大小是一个运行时属性,如果您想要避免二进制膨胀,则可以这样做:
template <typename T>
void showArrays(T* p, int n) {
for (int i = 0; i < n; ++i) {
std::cout << p[i] << '\n';
}
}
int main() {
std::array<int, 6> myArray = { 1,2,3,4,5,6 };
std::cout << "The array is \n";
showArrays(myArray.data(), 6); // or use myArray.size()
}
这是正确的答案。我不明白他想干什么。
template <typename T>
void showArrays(T* p, int n) {
for (int i = 0; i < n; ++i) {
std::cout << p[i] << '\n';
}
}
int main() {
std::array<int, 6> myArray = { 1,2,3,4,5,6 };
std::cout << "The array is \n";
showArrays(myArray.data(), 6); // or use myArray.size()
}
float a[] = { 1.1, 2.2, 3.3, 4.4 };
showArrays(a, 4); // full array
showArrays(a + 1, 2); // just the middle two
std::vector<long> v = /* ... */;
showArrays(v.data(), v.size());
std::string s = "hello world";
showArrays(s.data() + 6, 5);
template <typename T>
void showArrays(void* p, int n) {
// ^^^^^
for (int i = 0; i < n; ++i) {
std::cout << static_cast<T*>(p)[i] << '\n';
// ^^^^^^^^^^^^^^^^^^
// cast to object pointer,
// note that "T" shows up in your code now!
}
}
showArrays<int>(myArray.data(), myArray.size());
// ^^^^^
// explicit template argument