我想调用一个可以接受矢量但我想将不同类型的矢量传递给该函数的函数。
我遇到了像
这样的函数调用print<int>(int_vector);
print<string>(string_vector);
此处<int>
和<string>
被提及为什么。
另一个疑问是,如果我传递不同类型的向量,我怎么能在函数调用中使用它。我应该使用void *吗?然后键入cast it
答案 0 :(得分:2)
func模板示例
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void foo(std::vector<T> vec)
{
// do stuff with vector
}
int main() {
std::vector<int> iv = {42};
foo(iv);
std::vector<string> sv = {"hello"};
foo(sv);
return 0;
}
如果你知道确切的类型,还有另一种选择:
void foo(std::vector<int> v)
{}
void foo(std::vector<string> v)
{}
这是普通函数重载。
答案 1 :(得分:1)
代码使用模板编程来制作通用函数:
template <typename T>
void foo(T item){
// do something to item of type T
}
void foo(int str); // Declare a certain type of template
稍后您可以使用以下功能:
int x = 1;
foo<int>(x);
但在这种情况下,因为例如printf对不同的类型使用不同的格式,而不是重载函数可能是明智的。重载是类似命名函数的做法,但给出不同的参数:
void foo(std::vector<int> v);
void foo(std::vector<string> v);
答案 2 :(得分:1)
您想在这里使用的是模板化功能。与您的问题相关的简单示例将是:
// This line says that the function accepts one generic type
// which you will refer to as T
template <typename T>
// vector<T> means that the referenced type T will be of the type the vector,
// you call this function with, is templated with
void print(const std::vector<T>& data) {
// Here calling the operator[] will return the generic type T
const T& element = data[0];
for (unsigned i = 0; i < data.size(); ++i)
std::cout << data[i] << std::endl;
}
此功能将使用如下:
std::vector<int> vec = { 1, 2, 3 };
print(vec);
// Note that you don't need to write the template type here
// because it is deduced from the type of vector
输出将是:
1
2
3
答案 3 :(得分:0)
这个概念被称为通用编程。在C ++中,您使用templates来实现此目标,特别是function template。如果您希望自动推断出不同类型的不同类型的列表,或者需要高级模板,您还可以使用模板模板。
一个例子:
{{1}}
希望可以提供帮助。
答案 4 :(得分:0)
我相信你正在寻找ostream_iterator
:
template <typename T>
void print(vector<T> arg){
copy(cbegin(arg), cend(arg), ostream_iterator<T>(cout, " "));
}