2015-12-14 6 views
8

Ich mag würde, wie so eine Template-Funktion schreiben:Variadische Template-Funktion mit dem gleichen Argumente Typ

template <typename T> 
void f(const T & ...args) // <-- This doesn't work, unfortunately. 
{ 
    std::array<T> arr = { args... }; 
    // and so forth. 
} 

Offenbar C++ erlaubt es nicht, dass, weil es ein Template-Parameter Pack auf dem linken sein muss Seite von ...args für das zu arbeiten. Was ich will, ist eine Template-Funktion, bei der alle Argumenttypen gleich sind. Gibt es einen einfachen Weg, das zu tun?

+0

Wenn Sie jedes Argument Typ wissen, ist die gleiche: 'template void f (T const & x , Ts const & ... xs) {array arr = {x, xs ...};} ' – 0x499602D2

+0

ist das ähnlich? http://stackoverflow.com/questions/30773216/variadic-template-parameters-of-one-specific-type – nonsensation

Antwort

3
template <typename ... T> 
    void f(const T & ... args) 
    { 
     std::array<typename std::common_type<T...>::type, 
        sizeof...(T)> arr = {args...}; 
    } 

oder von std::experimental

template <typename ... T> 
    void f(const T & ... args) 
    { 
     auto arr = std::experimental::make_array<void>(args...); 
    } 

Die Leere macht der Rückgabetyp der common_type der Eingangsparameter sein, sonst können Sie angeben, welche Art Sie ausdrücklich wollen, wenn Sie es wissen.

+1

Sie können die '' für den Standardfall – melak47

+0

@ melak47 weglassen Fair genug, ich hatte gerade diese Funktion auf googled eine Laune und sonst nie davon gewusst. Ich werde es dort behalten, damit die Leute sehen, dass sie alles, was sie wollen, anstelle von "Leere" einsetzen können, aber ansonsten hast du absolut recht. – SirGuy

1

Ich würde eine weitere Lösung zu den bereits vorgeschlagenen hinzufügen.
Sie können dazu auch eine initializer_list verwenden.
Es folgt ein Arbeitsbeispiel:

#include<initializer_list> 
#include<vector> 
#include<string> 

template<class T> 
void fn(std::initializer_list<T> l) { 
    std::vector<T> v(l); 
    // so on 
} 

int main() { 
    fn<std::string>({ "foo", " bar" }); 
    return 0; 
} 
3
#include <tuple> 
#include <type_traits> 

template <typename T, typename... Ts> 
auto f(const T& t, const Ts&... ts) 
    -> typename std::enable_if<std::is_same<std::tuple<T, Ts...> 
              , std::tuple<Ts..., T> 
           >::value>::type 
{ 
} 

DEMO

+0

Ich bin mir nicht sicher, ob der Benutzer nach einem Weg zum Fehler gesucht hat, wenn die Parameter nicht alle gleich waren, aber dies ist ein interessanter Weg, dies zu tun. – SirGuy

+0

@GuyGreer * "Was ich will, ist eine Template-Funktion, bei der alle Argumenttypen gleich sind" * –

+0

Ich glaube, ich habe das nicht so interpretiert, dass er einen Fehler haben wollte, wenn das nicht der Fall war. Ich dachte, er suchte nach einer Kurzschrift, wenn das der Fall war. – SirGuy

Verwandte Themen