2016-07-15 6 views
3

Ich möchte einen Vektor von Paaren zu einer Funktion übergeben. Die tatsächliche Vektorimplementierung sowie die Typen des Paares sollten ein Vorlagenparameter sein.Vektor von Paaren mit generischen Vektor- und Paartyp, Vorlage der Vorlage

Ich dachte an etwas wie folgt aus:

template<uint8_t t_k, 
     typename t_bv, 
     typename t_rank, 
     template <template <template<typename t_x, 
            typename t_y> class std::pair> 
        typename t_vector>> typename t_vector> 

Die ersten 3 sind andere Template-Parameter. Der letzte Template-Parameter sollte es ermöglichen, einen vector (std oder stxxl:vector) von std::pair mit entweder uint32_t oder uint64_t als Typ des pair.first und pair.second zu übergeben.

+0

Oder Sie könnten jede Art so lange ermöglichen, wie es die Methoden hat Sie benötigen (zB 'vec.begin()', 'vec.end()', 'vec.begin(). Erste/second' usw.) – MadScientist

+0

Definieren Sie "tatsächliche Vektorimplementierung". –

+0

ja für den Vektor jeder Typ wäre in Ordnung Ich möchte nur den Typnamen angeben und dass es einen Typparameter std :: pair hat, der type Parameter mit typename t_x und t_y hat –

Antwort

2

Sie können diese verwenden:

template<typename X, 
     typename Y, 
     template<typename, typename> class Pair, 
     template<typename...> class Vector> 
void fun(Vector<Pair<X, Y>> vec) 
{ 
    //... 
} 
+0

@JanB Welchen Compiler benutzen Sie? – xinaiz

+0

vielen Dank. Es funktioniert perfekt und ist einfacher als ich dachte. Ich benutze gcc 4.9. –

1

Wenn ich Sie richtig verstehe, wollen Sie eine Funktion haben, die std::vector von Generika std::pair nimmt. Hier gehen Sie:

template <typename First, typename Second> 
void function(std::vector< std::pair<First,Second> > vector_of_pairs) 
{ 
    ... 
} 

EDIT: Wenn Sie beide std::vector und stxxl::vector nehmen möchten, können Sie Template-Template-Parameter mit C++ 11 des variadische Vorlagen (seit std::vector und stxxl::vectorverwenden unterschiedliche Anzahl der Template-Parameter):

template <typename First, 
      typename Second, 
      template <typename...> class AnyVector, 
      typename... OtherStuff> 
      void function(AnyVector<std::pair<First,Second>, OtherStuff...> vector_of_pairs) 
      { 
       /*...*/ 
      } 
+0

"sollte erlauben, einen Vektor (Std oder Stxxl: Vektor) zu übergeben" - Ihre Antwort verhindert die Verwendung von etwas außer 'std :: vector'. –

+0

@JamesAdkison Bearbeitet – PcAF

1

Nicht sicher, Ihre Anforderungen zu verstehen, aber ... was ist mit dem folgenden Beispiel?

#include <iostream> 
#include <utility> 
#include <vector> 
#include <deque> 

template <typename P1, typename P2, template<typename...> class Vect> 
std::size_t func (const Vect<std::pair<P1, P2>> & v) 
{ return v.size(); } 

int main() 
{ 
    std::vector<std::pair<int, long>> v1{ {1, 1L}, {2, 2L}, {3, 3L} }; 
    std::deque<std::pair<long, int>> v2{ {3L, 1}, {2L, 2} }; 

    std::cout << func(v1) << std::endl; 
    std::cout << func(v2) << std::endl; 

    return 0; 
}