2015-12-14 40 views
8

Chciałbym napisać funkcję szablonu tak:o zmiennej liczbie argumentów funkcja szablon z równych typów argumentów

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

Widocznie, C++ nie pozwala, bo tam musi być paczka parametr szablonu po lewej ręki stronie ...args, aby to działało. To, czego chcę, to funkcja szablonu, w której wszystkie typy argumentów są takie same. Czy istnieje prosty sposób na zrobienie tego?

+0

Jeśli znasz każdy rodzaj argument jest taki sam: 'template void f (const T & x , Ts const i ... xs) {tablica arr = {x, xs ...};} ' – 0x499602D2

+0

jest podobny? http://stackoverflow.com/questions/30773216/variadic-paragram-parametry-typu-typu-typowego – nonsensation

Odpowiedz

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

lub std::experimental

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

pustkę sprawia zwracany typ być common_type parametrów wejściowych, inaczej można określić, jaki rodzaj chcesz jawnie jeśli go znasz.

+1

Możesz pominąć '' dla domyślnego przypadku – melak47

+0

@ melak47 Wystarczająco uczciwego, właśnie googlowałem w tę funkcję kaprys i inaczej nigdy o tym nie wiedział. Zatrzymam go tam, aby ludzie zobaczyli, że mogą umieścić to, co chcą zamiast "void", ale poza tym masz absolutną rację. – SirGuy

1

Dodałbym jeszcze jedno rozwiązanie do już zaproponowanych.
Można również użyć do tego celu initializer_list.
Wynika działający przykład:

#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

Nie jestem pewien, czy użytkownik szukał sposobu na błąd, gdyby parametry nie były takie same, ale jest to ciekawy sposób, aby to zrobić. – SirGuy

+0

@GuyGreer * "To, czego chcę, to funkcja szablonu, w której wszystkie typy argumentów są takie same" * –

+0

Sądzę, że nie interpretowałem tego jako oznaczającego, że chciał on popełnić błąd, jeśli tak nie było. Myślałem, że szukał stenogramu, kiedy tak było. – SirGuy

Powiązane problemy