2012-04-09 11 views
3

sagen, dass ich in Namespace A. eine Template-Funktion habe ich Es gibt eine Template-Funktion im Namensraum A erklärt auch einen anderen Namespace B. haben, die alsTypedef mit Template-Funktionen

template<typename T, typename U> 
void f(T a, U b); 

nun im Namensraum B definiert ist, Ich möchte einen speziellen Typ der Template-Funktion deklarieren. Ich dachte, wenn ich die Template-Funktion typedef könnte, so dass es im Namensraum B als

void f(int a, double b); 

, ohne tatsächlich die Umsetzung der Funktion Aufruf der Template-Funktion deklariert wird. Da es eine Möglichkeit gibt, neue Typnamen mit bestimmten Template-Parametern zu deklarieren, sollte es nicht auch möglich sein, dies mit Funktionen zu tun? Ich habe verschiedene Methoden versucht, um es zu erreichen, aber es hat nicht ganz geklappt.

Gibt es also schon einen Weg in C++, die Funktion mit gegebenen Template-Parametern neu zu deklarieren, ohne tatsächlich eine neue Funktion zu implementieren? Wenn nicht, ist es irgendwie in C++ 11 erreichbar?

Es wäre ein nettes Feature zu haben, da es den Zweck der Funktion klarer und wäre syntaktisch besser :)

bearbeiten machen würde: So könnte man schreiben:

using A::f<int, double>; 

in B Namespace und die Funktion mit jener Vorlage auftauchen würde Parameter

+0

Nach einem Blick, tut diese Hilfe? http://www2.research.att.com/~bs/C++0xFAQ.html#template-alias – chris

+0

Nicht ganz sicher, ob es das tut, da es scheint, dass die aktuelle Version von Visual C++ keine Syntax unterstützt (?). Zumindest für mich hat es gerade viele Syntaxfehler ausgegeben – weggo

+0

Der Compiler muss das Feature auch unterstützen. Ich glaube nicht, dass GCC es schon tut. – chris

Antwort

5

können Sie verwenden using:

namespace A { 
    template <typename T> void f(T); 
    template <> void f<int>(int); // specialization 
} 

namespace B { 
    using ::A::f; 
} 

Sie können nicht zwischen den Spezialisierungen so unterscheiden (da using ist nur über Namen), aber es sollte genug sein, um die gewünschte Spezialisierung sichtbar zu machen.

2

Sie können eine Inline-Funktion wickeln:

namespace A 
{ 
    template<typename T, typename U> 
    void f(T a, U b); 
}; 

namespace B 
{ 
    inline void f(int a, double b) { A::f(a,b); } 
}; 

diese Frage Siehe:

C++11: How to alias a function?