C++ 如何将数组类型的动态对象传递给函数?

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

我想将动态大小标准和typename类型数组传递给函数

我不知道怎么做。为什么我不能接受对对象数组的引用

我尝试的代码:

#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