c++ - 将数组指针/引用发送到模板

标签 c++ arrays templates reference parameter-passing

我写了一个简单的程序,将数组 array[] 发送到名为 ARRAY_MAN 的函数,然后修改数组的内容:

#include <vector>
#include <iostream>

template <class Var, class T, std::size_t N, class... Args>
void ARRAY_MAN(Var variable, T(&)[N], uint32_t numParams, Args... args)
{
    std::vector<T> arguments{args...};

    if(arguments.size() != numParams)
        throw std::runtime_error("mismatch");

    for(uint32_t i = 0; i < numParams; ++i)
        variable[i] = arguments[i];
}


int main(int argc, char* argv[])
{
    int array[] = {1,2,3}; // (*)

    // print array before sending
    for(uint32_t i = 0; i < 3; ++i)
        std::cout << array[i] << " ";
    std::cout << std::endl;

    ARRAY_MAN(array, array, 3, 34, 56, 10);

    // print array after sending
    for(uint32_t i = 0; i < 3; ++i)
        std::cout << array[i] << " ";
    std::cout << std::endl;

    return 0;
}

这会编译并运行。但是,如果我用这一行替换标记为 (*) 的行:

int *array = new int(3);

我收到这个错误:

no matching function for call to ‘ARRAY_MAN(int*&, int*&, int, int, int, int)’

如何将第二个 array 发送到 ARRAY_MAN 函数?

最佳答案

只需阅读编译器错误信息:

$ g++ --std=c++14 -o a a.cpp
a.cpp: In function ‘int main(int, char**)’:
a.cpp:26:42: error: no matching function for call to ‘ARRAY_MAN(int*&, int*&, int, int, int, int)’
     ARRAY_MAN(array, array, 3, 34, 56, 10);
                                          ^
a.cpp:5:6: note: candidate: template<class Var, class T, long unsigned int N, class ... Args> void ARRAY_MAN(Var, T (&)[N], uint32_t, Args ...)
 void ARRAY_MAN(Var variable, T(&)[N], uint32_t numParams, Args... args)
      ^
a.cpp:5:6: note:   template argument deduction/substitution failed:
a.cpp:26:42: note:   mismatched types ‘T [N]’ and ‘int*’
     ARRAY_MAN(array, array, 3, 34, 56, 10);

函数的第二个参数是对固定长度数组的引用,而不是对指针的引用。如果您的函数参数是 T[]T[N]T*,那么所有(AFAICR)都等同于同一件事- 拿一个指针。但是固定长度数组引用 是特殊的。另见:

What is useful about a reference-to-array parameter?

您可以说这是一种通过向后兼容 C 并为函数提供“真正的”数组参数的方法。

关于c++ - 将数组指针/引用发送到模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45600991/

相关文章:

javascript - 如何将数字数组变成对象数组

c++ - 嵌套模板列表错误

C++ 模板 std::vector::iterator 错误

C++ 分配器和内存池所有权

c++ - 在类中专门化模板函数

c++ - Mac Sandbox 的 QFileDialog 和 setDefaultSuffix

c# - 排序数组的二分查找

javascript - 为什么选择排序在 Javascript 中这么快?

c++ - 对象没有命名类型 - C++

c++ - 带子目录的 OMake 编译