2016-03-18 21 views
1

Betrachten Sie diesen Code:C++ Reihe von verschiedenen Typen Allgemeiner

template<typename T> 
void doSomething(std::vector<T> arr) { 
    for (auto i = 0; i < arr.size(); ++i) 
     std::cout << arr[i] << std::endl; 
} 

int main() 
{ 
    doSomething(std::vector<int> { 1, 5, 7 }); 
} 

In diesem Beispiel wird eine Schablone verwendet wird, ziemlich regelmäßig. Ein Array von drei ganzen Zahlen wird in eine Funktion übergeben, die einen Parameter eines Arrays der allgemeinen Typen vom Typ T aufweist. Es wird dann angegeben, dass sie vom Typ int hier sind: std::vector<int> { 1, 5, 7 }.

Was ich tun möchte, ist die std::vector zu initialisieren, um drei verschiedene Arten zu enthalten. Etwas wie folgt aus:

doSomething(std::vector<T> { 1, "Hi", 2.7f }); 

Hier gibt es keinen bestimmten Typ, und die std::vector nicht nur ganze Zahlen enthalten. Gibt es eine Möglichkeit, so etwas zu tun? Vielen Dank!

+0

(Ich denke) Sie könnten es mit vielen Klassen vortäuschen, aber das wäre schrecklich Code – Amit

Antwort

4

Dies ist mit std::vector nicht möglich. Das Template-Argument ist eindeutig.

Überprüfen Sie std::tuple, die tun können, was Sie wollen.

std::tuple<int, std::string, float> 

Wenn Sie mehr Genericity benötigen Sie so etwas zu tun haben:

template<typename U, typename V, typename W> 
void doSomething(std::tuple<U,V,W> t) { ... } 

Wenn Sie ein Tupel mit einer beliebigen Anzahl von Elementen wollen, müssen Sie variadische Vorlagen verwenden, dann:

template<typename... Ts> 
void doSomething(std::tuple<Ts...> data) { 
    // ... 
} 
+0

Wie erwähnt von Guillaume variadic Vorlagen beantworten Sie Ihre Frage, aber ich werde es Ihnen im Moment nicht empfehlen. Siehe [std :: tuple foreach implementation] (https://codereview.stackexchange.com/questions/51407/stdtuple-foreach-implementation), um sie zu durchlaufen. – coincoin

0

Nein, so funktioniert C++ nicht. C++ ist eine statisch typisierte Sprache. Die Typen aller Variablen müssen zur Kompilierzeit deklariert werden.

Andere Sprachen, wie Perl, Python, Javascript und andere, werden dynamisch typisiert. Der Typ eines Objekts wird zur Laufzeit festgelegt, sodass das äquivalente Array-Konstrukt in dynamisch typisierten Sprachen Werte verschiedener Typen enthalten kann.

Verwandte Themen