2016-07-18 9 views
0

Dies ist eine Nachfolge von Vector of pairs with generic vector and pair type, template of template.Stxxl Vektor als Tropfenersatz für Std :: Vektor

Ich möchte in der Lage sein, ein Verfahren zu nennen einem mit std::vector oder stxxl:vector, während Vorlage Argumente des vector (Paares x, y) festgelegt sind.

Insbesondere die Methode signatrue könnte wie folgt aussehen:

template<typename t_x, typename t_y, 
      template<typename, typename> class t_pair, 
      template<typename...> class t_vector> 
    method(t_vector<t_pair<t_x,t_y>> &v) 

Leider, wenn die Signatur wie diese Angabe, ist es nicht möglich ist, ein stxxl:vector als t_vector passieren. Es führt zu dem folgenden Compiler-Fehler:

sad.hpp:128:5: note: template argument deduction/substitution failed: 
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’ 
     method(coordinates); 
         ^
program.cpp:104:52: error: expected a type, got ‘4u’ 
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’ 
program.cpp:104:52: error: expected a type, got ‘2097152u’ 

Die Frage, wie ist stxxl::vector als Drop-in-Ersatz die Methodensignatur, um in der Lage zu ändern, um Code std::vector vorhandenen zu benutzen?

Update auf, warum ich verschachtelte Vorlagen für den Vektor verwende: Ich könnte mich irren, aber ich möchte den Compiler, der für die Variablen in der oben genannten Methode eingibt.

Ich zum Beispiel bin den Aufbau einer vector oder ein queue

std::vector<t_x> intervals(k * k + 1); 
typedef std::tuple<std::pair<t_x,t_y>,std::pair<t_x,t_y>, std::pair<t_x,t_y>, uint> t_queue; 
std::queue <t_queue> queue; 

die entweder uint32_t or uint64_t je nachdem, ob die Art der Paarelemente ist uint32_t or uint64_t

+0

Warum müssen Sie die Vorlagenparameter so spezifizieren? Warum nicht einfach einen einfachen Typnamen t_vector ohne all die anderen Parameter verwenden? Einen Template-Template-Parameter zu haben, ist nützlich, wenn Sie diesen Template-Parameter verwenden, um verschiedene Typen zu konstruieren, aber in Ihrem Fall verwenden Sie ihn nur mit einem Typ, der 't_pair' ist. – Holt

+0

Ich benutze Uint32_t und Uint64_t als Vorlage Parameter des Paares. Ich verwende daher t_x/t_y in meinem Code, um zu entscheiden, ob 32/64 Bit-Ganzzahlen verwendet werden sollen. –

+0

Ich sehe nicht wirklich, warum Ihnen die Vorlage so hilft, wie Sie es mit der einfachen Form machen? Können Sie Ihre Frage aktualisieren, um uns genau zu zeigen, warum Sie solche Vorlagenparameter benötigen (und warum das einfachere Formular für Sie nicht funktioniert)? – Holt

Antwort

3

Das Problem sein sollte, ist, dass stxxl::vector hat nicht -Typ Template-Parameter:

BlockSize external block size in bytes, default is 2 MiB

So kann es nicht ma sein tch gegen template <typename... >.

Sie sollten keine Vorlage Template-Parameter in diesem Fall so etwas wie dies wäre besser (glaube ich) verwenden:

template <typename t_vector> 
void method (t_vector &v) { 
    typedef typename t_vector::value_type::first_type t_x; 
    typedef typename t_vector::value_type::second_type t_y; 
    // or in c++11 and above 
    typedef decltype(v[0].first) t_xd; 
    typedef decltype(v[0].second) t_yd; 
} 

Im obigen Sie abrufen t_x und t_y entweder mit:

  • value_type was ist alles, was Container haben sollte (sowohl std::vector als auch stxxl::vector haben es);
  • decltype, die direkt den Typ aus dem Ausdruck v[0].first (funktioniert auch wenn v ist leer, da der Ausdruck innerhalb decltype wird nie ausgewertet).

Aus meiner Erfahrung ist es besser, ein sehr generisches Template-Argument zu verwenden und dann Informationen aus diesem abzurufen (value_type, decltype, ...) als Versuch, die Vorlage Argumente selbst mit bestimmten Typen Zwang.