我有一个接受可变大小数组的函数,但它仍然有些混乱,我无法将其缩小为更容易使用的东西。我不要求被勺子,但我正在寻找一些关于如何解决这个问题的建议。
以下是我必须设置变量以传递给函数的方式,非常繁琐冗余:
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;
}
答案 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;
}