2014-06-20 7 views
6

Mam zmiennej liczbie argumentów funkcji takich jak:aliasing do zmiennej liczbie argumentów funkcji szablonu

void test(int){} 

template<typename T,typename...Args> 
void test(int& sum,T v,Args... args) 
{ 
    sum+=v; 
    test(sum,args...); 
} 

Chcę aliasu go do czegoś podobnego:

auto sum = test;//error : can not deduce auto from test 
int main() 
{ 
    int res=0; 
    test(res,4,7); 
    std::cout<<res; 
} 

Próbowałem przy użyciu std::bind ale to nie działa ze zmiennej liczbie argumentów Funkcjonuje, ponieważ potrzebuje obiektów zastępczych ...

Czy możliwe jest alias funkcji variadic?

+3

'auto sumę = [] (automatycznie && ... s) {powrotu test (std :: forward (pp) ...); }; 'lub coś podobnego. To nie jest prawdziwy pseudonim; na przykład nie można użyć 'auto x = & sum ;'. – dyp

Odpowiedz

1

Co próbujesz nie różni się zbytnio od

void test(int) 
{ 
} 

void test(double, int) 
{ 
} 

auto a = test; 

Nie ma sposobu, aby kompilator wykryć przeciążenie który chcesz użyć.

Możesz być jawne, o których test chcesz przypisać do a przez:

auto a = (void(*)(int))test; 

Jeśli chcesz dodać zmiennej liczbie argumentów wersję szablonu do mieszanki, można użyć:

template<typename T,typename...Args> 
void test(int& sum,T v,Args... args) 
{ 
    sum+=v; 
    test(sum,args...); 
} 

auto a = test<int, int, int>; 
+0

BTW dla tego przypadku, jeśli chciał 'test (double, int)', mógłby zrobić to: http://ideone.com/KFJnjh – yizzlez

+0

Wiem, że szukałem sposobu na wywieranie funkcji variadic. Rozwiązania @dyp wydaje się działać z gcc 4.9, http: //coliru.stacked-crooked.com/a/d3aabbd801efe463 – Omid

+0

Nie odpowiada na pytanie.BTW 'auto a = test ;' nie działa : http://coliru.stacked-crooked.com/a/4c19105de2b3d597 – Omid

0

To nie jest wygładzanie. auto a = test próbuje zadeklarować zmienną a z tym samym typem co test i uczynić je równymi. Ponieważ test nie jest pojedynczą funkcją, ale szablonem funkcji (a na dodatek można nawet przeciążyć funkcje), kompilator nie może zdecydować, jaki powinien być typ.

Aby utworzyć alias szablonu, lub w rzeczywistości dowolny symbol, można użyć słowa kluczowego using.

using a = test; 

Edycja: przepraszam, ten działa tylko dla typów nie funkcji.

+0

To nie działa: http://ideone.com/xJccNe – yizzlez

+0

nie można aliasować funkcji szablonu przy użyciu! – Omid

+0

Tak, mój zły, możesz alias functor chociaż. Cóż, obecnie nie jest to możliwe w C++. –

4

C++ 1y:

#include <iostream> 

void test(int){} 

template<typename T,typename...Args> 
void test(int& sum,T v,Args... args) 
{ 
    sum+=v; 
    test(sum,args...); 
} 

template<typename T,typename...Args> 
decltype(test<T, Args...>)* sum = &(test<T, Args...>); 

int  main(void) 
{ 
    int res = 0; 
    sum<int, int>(res, 4, 7); 
    std::cout << res << std::endl; 
} 

Alternatywnie owinąć go w innej zmiennej liczbie argumentów funkcji i std::forward argumenty:

template<typename T,typename...Args> 
void other(int&sum, T v, Args&&... args) 
{ 
    test(sum, std::move(v), std::forward<Args>(args)...); 
} 
+1

Interesujące, ale wątpię, że potrącenie będzie działało dla tego "aliasu". – dyp

+0

@dyp Obecnie nie ma zwykłych kompilatorów, ale może pewnego dnia nie tak daleko :) – Drax

+0

Hmm wątpię w składnię * szablonów * obsługuje to; ponieważ zdefiniowany szablon nie ma wzorców odpowiadających argumentom wywołania funkcji. Zastanów się nad specjalizacjami szablonu zmiennej. Tylko w bardzo ograniczonym kontekście szablon zmienny może być postrzegany jako alias, a kompilator musiał przeglądać tę warstwę abstrakcji. – dyp