1

一連の数値を出力する関数があるとします。1, 2, 3, 4, 5これらの数値は、配列またはベクトルとして格納できます。したがって、現在のシステムでは、これらのパラメーターのいずれかを受け入れる 2 つの関数があります。

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);    
}

どんな助けでも大歓迎です。

4

2 に答える 2

9

通常のイディオムは、反復子を渡すことです。1 つは範囲の最初の要素用で、もう 1 つは「末尾の 1 つ後」に対応します。

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());    
}
于 2013-05-22T12:50:48.920 に答える
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));
}
于 2013-05-22T12:52:45.227 に答える