编辑:
另
一种解决方案...如果您的编译器的 IDE部分支持C++11
,您可以std::vector
在调用时初始化 a ,即
template <typename T>
void TestFunction(std::vector<T> vect)
{
....
}
....
TestFunction(std::vector<int>{1,2,3});
这种方法的优点是当函数超出范围时,STL 会自动释放分配的内存。
如果这不起作用,您可以求助于两个班轮...
template <typename T>
void TestFunction(std::vector<T> vect)
{
....
}
....
std::vector<int> tmp(1,2,3);
TestFunction(tmp);
最大的缺点是,这里的内存位于堆栈上,直到您离开该范围(或显式地将向量的大小调整为零长度。
这两种方法都有一些优点......计数是内置的,您可以访问其他有用的成员函数或附属方法(如std::sort
)。
...................................................
为什么不使用可变参数?例如,请参阅此处的答案......
在 C API 中使用可变参数来设置键值对是个好主意吗?
在C+11
不兼容的编译器(例如您的 IDE)上,您可以尝试...
template <typename T>
TestFunction(const unsigned int count, T * arr)
TestFunction<std::string>(10, new string[] {"One", "Two", "Three"});
(听起来你不能在你的 IDE 中使用它,但是......)如果你确信你只是在现代机器上编译并且主要使用简单类型,这是最好/最符合标准的解决方案......
你C++11
可以使用std::initializer
which is in std::vector
:
#include<vector>
template <typename T>
void TestFunction(const std::initializer_list<T>& v)
{ }
int main()
{
TestFunction<double>({1.0, 2.0});
return 0;
}
…………………………………………………………………………………………
...但是,这需要您的编译器,C+11
因此它不是完全可移植的。对于除了简单类型之外的任何东西,它也变得更难阅读。
我知道您说的是on the function
调用,但您可能想从可读性和易于编码的方法重新考虑这一点。
我同意你的部分方法——你想要的是使用一个template
函数(它处理变量type
)。在调用之前,将相同类型元素的集合初始化为临时标准 C 数组或std::vector
/ std::list
(STL 的数组包装器)。
http://www.cplusplus.com/doc/tutorial/templates/
http://www.cplusplus.com/reference/vector/
http://www.cplusplus.com/reference/list/
它的代码行数更多,但可读性和标准化程度更高。
IE
而不是...
MyFunction({1,2,3});
利用:
template <typename T>
void TestFunction(const int count, T * arr)
{
for (unsigned int i = 0; i < count; i++)
{
.... arr[i] ... ; //do stuff
...
}
}
int main()
{
int * myArr = {1,2,3};
TestFuntion<int>(3, myArr);
}
...或者...
#include <vector>
template <typename T>
void TestFunction(std::vector<T> vect)
{
for (unsigned int i = 0; i < vect.size(); i++)
{
.... vect[i] ... ; //do stuff
...
}
}
int main()
{
std::vector<int> myVect;
myVect.push_back(1);
myVect.push_back(2);
myVect.push_back(3);
TestFuntion<int>(myVect);
}
std::list
也将是完全可以接受的,并且可能会表现得更好,具体取决于您的用例。