使用模板在矢量和数组之间交替

时间:2013-05-22 12:45:44

标签: c++ oop templates

假设我有一个打印一组数字的函数:1, 2, 3, 4, 5,这些数字既可以存储为数组,也可以存储为矢量。因此,在我当前的系统中,我有两个接受这些参数的函数。

void printNumbers(std::vector<double> &printNumbers)
{
   //code 
   //....
}

因此接受一个数组..

void printNumbers(int* numbers)
{
   //code 
   //...
}

这似乎浪费了代码,并且,我认为我可以更好地利用代码重用,这让我思考:我可以使用模板来确定传递给函数的输入类型?例如,它是vector还是array还是只是一个整数值?

以下是原型:

#include <iostream>

using namespace std;

template<class T>
void printNumbers(T numbers)
{
// code 
// code
}

int main(int argc, char *argv[]) {
   int numbers[] = {1, 2, 3, 4, 5};
   printNumbers<array> (numbers);    
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:9)

通常的习惯用法是传递迭代器,一个用于范围的第一个元素,另一个用于“一个超过结束”:

template<class Iterator>
void printNumbers(Iterator begin, Iterator end)
{
  for (Iterator i = begin; i != end; ++i)
    std::cout << *i << " ";
  std::cout << "\n";
}

int main() 
{
   int numbers[] = {1, 2, 3, 4, 5};
   printNumbers(numbers, numbers + 5);
   printNumbers(std::begin(numbers), std::end(numbers); // C++11 version
   std::vector<int> v{1,2,3,4,5};
   printNumbers(v.begin(), v.end());    
}

答案 1 :(得分:4)

您可以按照STL算法的示例并接受迭代器范围。容器具有迭代器类型,指针可用于迭代数组:

template <typename InputIterator>
void printNumbers(InputIterator start, InputIterator end) {
    // print "*start", and iterate up to "end"
}

为方便起见,您可以重载它以直接接受容器和数组:

template <typename Container>
void printNumbers(Container const & c) {
    printNumbers(c.begin(), c.end());
}

template <typename T, size_t N>
void printNumbers(T (const & a)[N]) {
    printNumbers(a, a+N);
}

在C ++ 11中(或使用您自己的beginend函数),您可以将它们组合在一起:

template <typename Container>
void printNumbers(Container const & c) {
    printNumbers(std::begin(c), std::end(c));
}