2017-12-02 5 views
0

Betrachten Sie hat folgende Pseudo-Code:erkennen, ob ein Behälter Iteratortyp oder nicht

template<class Container> 
int some_function(const Container& container) 
{ 
     if (container has iterator) { // 
      // get an element by its iterator 
     } else { 
      // do another action 
     } 
} 

So haben wir eine Funktionsvorlage, die einen Containertyp nimmt (zum Beispiel, Vektor, Liste, valarray oder etwas anderes.). Ist es möglich zu bestimmen (Laufzeit), ob ein gegebener Container einen Iteratortyp hat? Zeit kompilieren?

+1

Wenn es ein 'STL' Behälter ist dann einen Iterator hat. In der Regel ist es jedoch flexibler/wiederverwendbar, Iteratoren als Parameter und nicht als Container zu verwenden. – Galik

+0

Müssen Sie sowohl den Fall unterstützen, in dem Container einen Iteratortyp hat, als auch den Fall, in dem dies nicht der Fall ist? Dein Code bedeutet, dass du es tust, aber das ist nicht die Frage, die du gestellt hast. – tweej

+0

Ja, ich möchte beide Fälle unterstützen. Meine Frage ist: Ermitteln, ob ein Container Iterator-Typ hat oder nicht, und im Code-Snippet habe ich es als Bedingung ausgedrückt. Ich denke, das ist eine Frage, die ich gestellt habe. –

Antwort

2

Sie verwenden die detection idiom

#include<experimental/type_traits> 

template<typename T> 
using iterator_t = typename T::iterator; 

template<typename T> 
constexpr bool has_iterator = std::experimental::is_detected_v<iterator_t, T>; 

template<class Container> 
int some_function(const Container& container) 
{ 
     if constexpr (has_iterator<Container>) { 
      // get an element by its iterator 
     } else { 
      // do another action 
     } 
} 
Verwandte Themen