2016-04-08 4 views
0

Ich habe folgende Template-Funktion: DieseC++ Specialized Konstruktor der Klasse ohne Vorlage Argumente (spitze Klammern überspringen)

template<> 
int test_function(int arg) {return arg;} 

:

template<typename T> 
T test_function(T arg) {return arg;} 

ich eine spezielle Version dieser für ganze Zahlen mit erstellen ist praktisch, wenn ich diese Funktion sehr oft mit ganzen Zahlen verwende. So kann ich es mit nennen:

test_function(some_integer);  // easy! 
test_function<int>(some_integer); // not necessary all the time. 

Jetzt habe ich die folgende Klasse:

template<typename T> 
class Foo 
{ 
public: 
    Foo(); 
}; 

ich es nennen wollen in der Lage sein mit:

Foo foo1;  // how do I do this? 
Foo<int> foo2; // I don't want to use this all the time. 

Wie kann ich definieren diese Klasse, um eine Instanz davon erstellen zu können, ohne spitze Klammern zu verwenden? Sollte nicht allzu schwer sein, denke ich, aber ich konnte es nicht so weit heraus ...

+2

Sie müssen nicht die Spezialisierung von 'test_function' für' int' erstellen (es sei denn, es macht etwas anderes), es kann den Typ aus dem Argument ableiten. –

+1

Konstruieren Sie es über eine make_-Funktion, um den Argumenttyp abzuleiten. Ein Beispiel finden Sie unter std :: make_tuple. –

+0

@AntonSavin Ah ich sehe, danke für den Hinweis! – donald

Antwort

0
template<typename T> 
T test_function(T arg) {return arg;} 

template<> 
int test_function<int>(int arg) {return arg;} 
+0

Ja, das funktioniert auch für das Funktionsbeispiel, aber wie kann ich das für die Klasse machen? – donald

+0

Klassenfunktionen können spezialisiert außerhalb der Klasse wie folgt sein: 'Vorlage <> MyClass :: MyClass() {/ * Konstruktor, spezifisch für Int * /}' –

2

Sie sollten entweder Standardargument (int) und dann:

template<typename T = int> class Foo {}; 
Foo<> foo2; 

oder machen ein Alias:

using MyFoo = Foo<int>; //or just Foo<> if using default argument 
MyFoo foo1; 

ich glaube, Sie nicht ein Objekt der Templat-Klasse erstellen können, ohne darauf hinweist, dass es sich um eine Template-Klasse ist auch, wenn alle Vorlagenargumente Standardwerte haben.

HINWEIS: using ist C++ 11 Schlüsselwort, verwenden Sie typedef für Legacy-Code/Compiler.

+0

Hmm ok, ich tat es so weit. Der Grund, warum ich es ohne Klammern bevorzugen würde, ist, die Verwendung dieser Klasse einfacher zu machen. Danke für den Aliashinweis, ich denke, ich werde mit dem gehen, wenn es keine andere Lösung gibt. – donald

+0

@donald Dies ist die Standardmethode. 'using' ist eigentlich sehr nett und es existiert hauptsächlich für diesen Zweck. Seine Syntax ist auch besser und konsistenter als 'typedef 'und kann innerhalb einer Klasse geschachtelt werden:' class A {public: using B = SomeClass; } 'und dann' A :: B' ist ein gültiger Typ (Alias ​​zu 'SomeClass'). – Resurrection

+0

Es ist erwähnenswert, dass "typedef" in jeder Hinsicht äquivalent zur entsprechenden 'using' Deklaration ist, insbesondere kann es auch innerhalb einer Klasse geschachtelt sein. –

Verwandte Themen