如何将支撑列表/动态数组传递给函数(c ++)

时间:2015-06-23 05:24:18

标签: c++

我有一个接受可变大小数组的函数,但它仍然有些混乱,我无法将其缩小为更容易使用的东西。我要求被勺子,但我正在寻找一些关于如何解决这个问题的建议。

以下是我必须设置变量以传递给函数的方式,非常繁琐冗余:

DWORD xAAR[4] = { base, 0x5EC5E4, 0x5A8, 0x3C };
x = pGet(xAr, 5);

以下是我想要浓缩的内容(请注意每种用法的元素数量会有所不同):

x = pGet({ base, 0x5EC5E4, 0x5A8, 0x3C });

以下是功能本身,为简洁起见,将其排除在外。

DWORD pGet(DWORD p[], int sizeA)
{
    DWORD address;
    for (int i = 1; i < sizeA; i++)
    {
    }
    return NULL;
}

3 个答案:

答案 0 :(得分:2)

您可以使用以下一组功能,以便更轻松地使用大量容器。

template <typename Iterator>
DWORD pGet(Iterator begin, Iterator end)
{
   DWORD ret = 0;
   for (Iterator iter = begin ; iter != end; ++iter )
   {
      // Do something with the item.
   }
   return ret;
}

template <typename Container>
DWORD pGet(Container const& c)
{
   return pGet(std::begin(c), std::end(c));
}

DWORD pGet(std::initializer_list<DWORD> const& c)
{
   return pGet(std::begin(c), std::end(c));
}

用法:

int main()
{
   DWORD base = 10;

   // Use pGet with an array.
   DWORD xAAR[4] = { base, 0x5EC5E4, 0x5A8, 0x3C };
   pGet(xAAR);
   pGet(xAAR, xAAR+2); // Work with a subset of the array.

   // Use pGet with an initializer_list.
   pGet({ base, 0x5EC5E4, 0x5A8, 0x3C});

   // Use pGet with a vector.
   std::vector<DWORD> v = { base, 0x5EC5E4, 0x5A8, 0x3C };
   pGet(v);
   pGet(v.begin(), v.begin()+2); // Work with a subset of the vector

   // Use pGet with a set.
   std::set<DWORD> s = { base, 0x5EC5E4, 0x5A8, 0x3C };
   pGet(s);
}

答案 1 :(得分:1)

好像你可能是varargs。这允许您使用可变数量的参数调用函数,该函数可以确定有多少参数。例如,这就是printf的工作原理。

另一个想法是使用initializer_lists,因此你不再传递原始数组,而是将它包装在一个向量或类似的东西中。

答案 2 :(得分:-1)

这看起来更简单。

void print(int *a, int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
}
int main()
{
    print(new int[3] {1, 2, 3}, 3);
    cout << endl;
    print(new int[2] {2, 3}, 2);
    cout << endl;

    return 0;
}