2014-06-20 2 views
6

ich eine variadische Funktion haben wie:Aliasing eine variadische Template-Funktion

void test(int){} 

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

ich es etwas an Alias ​​wie wünschen:

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

ich std::bind versucht mit, aber es mit variadische funktioniert nicht Funktionen, weil Platzhalter benötigt werden ...

Ist es möglich, eine Variadic-Funktion zu aliasieren?

+3

'auto sum = [] (auto && ... pp) {return test (std :: vorwärts (pp) ...); }; 'oder so ähnlich. Es ist jedoch kein echter Alias; zum Beispiel können Sie 'auto x = & sum ;' nicht verwenden. – dyp

Antwort

1

Was Sie versuchen, ist nicht viel anders aus

void test(int) 
{ 
} 

void test(double, int) 
{ 
} 

auto a = test; 

Es gibt keine Möglichkeit für den Compiler zu erkennen, die Sie verwenden möchten, überlasten.

Sie können explizit sein, über die test Sie a zuweisen möchten von:

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

Wenn Sie die variadische Template-Version auf die Mischung hinzufügen möchten, können Sie verwenden:

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 für diesen Fall, wenn er 'test (double, int)' wollte, könnte er dies tun: http://ideone.com/KFJnjh – yizzlez

+0

Ich weiß, dass ich nach einer Möglichkeit suchte, variadic Funktion zu erkennen. @dyp solutions scheint mit gcc 4.9 zu arbeiten, http: //coliru.stacked-crooked.com/a/d3aabbd801efe463 – Omid

+0

Es beantwortet nicht die Frage.BTW 'auto a = test ;' funktioniert nicht : http://coliru.stacked-crooked.com/a/4c19105de2b3d597 – Omid

0

Dies ist kein Aliasing. auto a = test versucht, eine Variable a mit dem gleichen Typ wie test zu deklarieren und sie gleich zu machen. Da test keine einzelne Funktion ist, sondern eine Funktionsschablone (und darüber hinaus können Sie sogar Funktionen überladen), kann der Compiler nicht entscheiden, was der Typ von a sein soll.

Um eine Vorlage, oder als ein beliebiges Symbol, zu aliasieren, können Sie das Schlüsselwort using verwenden.

using a = test; 

Edit: sorry dieses funktioniert nur für Typen nicht funktioniert.

+0

Dies funktioniert nicht: http://ideone.com/xJccNe – yizzlez

+0

Sie können eine Vorlagefunktion nicht mit Alias ​​verwenden! – Omid

+0

Ja, mein Schlechter, du kannst einen Funktor alias haben. Nun, es ist momentan unmöglich in C++. –

4

In C++ 1J:

#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; 
} 

Alternativ wickeln Sie es in einer anderen variadische Funktion und std::forward die Argumente:

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

Interessant, aber ich bezweifle, dass Typabzug für diesen "Alias" funktioniert. – dyp

+0

@dyp Zur Zeit geht es nicht mit den üblichen Compilern, aber vielleicht eines Tages nicht so weit :) – Drax

+0

Hmm ich bezweifle die Syntax für * variable Templates * wird dies unterstützen; da die definierte Vorlage keine Muster enthält, die mit den Argumenten des Funktionsaufrufs übereinstimmen. Berücksichtigen Sie Spezialisierungen der Variablenvorlage. Nur in sehr eingeschränkten Kontexten konnte eine variable Vorlage als Alias ​​angesehen werden, und der Compiler musste diese Abstraktionsebene "durchsehen". – dyp