Wie rufe ich statische Member einer Template-Klasse auf?

8

Wenn ich:

%Vor%

In diesem Fall ist A<int>::f() dasselbe wie A<double>::f() , aber ich möchte nicht A::f() über den Template-Parameter aufrufen. Gibt es eine Syntax, die den Aufruf von f() erlaubt, aber nicht den Template-Parameter erfordert?

    
Mihran Hovsepyan 08.12.2010, 17:39
quelle

6 Antworten

15

Der Compiler weiß nicht, dass A<T>::f() nicht den Typ Parameter T verwendet. So wie es ist, müssen Sie dem Compiler immer dann einen Typ geben, wenn Sie f verwenden.

Aber wenn ich eine Template-Klasse entwerfe und merke, dass einige Member / Methoden nicht von Template-Parametern abhängig sind, verschiebe ich diese oft in eine Nicht-Template-Basisklasse.

%Vor%

Jetzt sind A_Base::f() , A<int>::f() und A<double>::f() wirklich alle gleich.

    
aschepler 08.12.2010, 17:44
quelle
2
___ qstnhdr ___ Wie rufe ich statische Member einer Template-Klasse auf? ___ antwort4390551 ___
  1. Es gibt keine Syntax, um dies zu spezifizieren. Es gibt wenig Grund, f trotzdem zu einer statischen Methode zu machen. Machen Sie stattdessen eine freie Funktion. Wenn Sie aus irgendeinem Grund eine statische Methode erstellen müssen, implementieren Sie sie als freie Funktion und rufen Sie sie einfach auf.
  2. Viele Compiler werden das wahrscheinlich automatisch für Sie tun.
___ answer4390545 ___

Nein - Wenn Sie kein Template-Argument verwenden möchten, deklarieren Sie die Klasse nicht mit einem Template-Parameter. Wenn Sie das Template-Argument für andere Member der Klasse benötigen, aber nicht in %code% benötigen, verschieben Sie %code% aus der Klasse.

    
___ answer4390559 ___

Der Compiler weiß nicht, dass %code% nicht den Typ Parameter %code% verwendet. So wie es ist, müssen Sie dem Compiler immer dann einen Typ geben, wenn Sie %code% verwenden.

Aber wenn ich eine Template-Klasse entwerfe und merke, dass einige Member / Methoden nicht von Template-Parametern abhängig sind, verschiebe ich diese oft in eine Nicht-Template-Basisklasse.

%Vor%

Jetzt sind %code% , %code% und %code% wirklich alle gleich.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ antwort4390572 ___

Sicher. Geben Sie ihm einen Aliasnamen, indem Sie ihn einem Funktionszeiger zuweisen.

    
___ qstntxt ___

Wenn ich:

%Vor%

In diesem Fall ist %code% dasselbe wie %code% , aber ich möchte nicht %code% über den Template-Parameter aufrufen. Gibt es eine Syntax, die den Aufruf von %code% erlaubt, aber nicht den Template-Parameter erfordert?

    
___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ answer4390647 ___

Eine Clodgie funktioniert nicht (wenn Sie die Vererbung nicht verwenden wollen und sie nicht zu einer Nicht-Member-Funktion machen wollen), könnten Sie einen Standardtyp für Ihre Klasse angeben:

%Vor%

HINWEIS: Diese Methode ist jedoch nicht dasselbe wie , %code% oder %code% usw., aber wenn Sie keine Typabhängigkeit in der Funktion haben, dann könnte das obige funktionieren ...

    
___ antwort4390550 ___

Nein, %code% stimmt nicht mit %code% überein. Sie sind wirklich anders. Wenn %code% wirklich unabhängig vom Parameter sein soll, können Sie die Template-Klasse %code% von einer anderen Klasse erben lassen (manchmal auch als Eigenschaft bezeichnet), die %code% als statische Member-Funktion anbietet:

%Vor%

Dann können Sie entweder %code% oder %code% aufrufen.

    
___ tag123staticmethods ___ Methoden, die weder eine Instanz der Klasse erfordern, noch implizit auf die Daten (oder diese, self, Me usw.) einer solchen Instanz zugreifen können. ___
Billy ONeal 08.12.2010 17:44
quelle
1

Nein - Wenn Sie kein Template-Argument verwenden möchten, deklarieren Sie die Klasse nicht mit einem Template-Parameter. Wenn Sie das Template-Argument für andere Member der Klasse benötigen, aber nicht in f benötigen, verschieben Sie f aus der Klasse.

    
cdhowie 08.12.2010 17:43
quelle
1
___ qstnhdr ___ Wie rufe ich statische Member einer Template-Klasse auf? ___ antwort4390551 ___
  1. Es gibt keine Syntax, um dies zu spezifizieren. Es gibt wenig Grund, %code% trotzdem zu einer statischen Methode zu machen. Machen Sie stattdessen eine freie Funktion. Wenn Sie aus irgendeinem Grund eine statische Methode erstellen müssen, implementieren Sie sie als freie Funktion und rufen Sie sie einfach auf.
  2. Viele Compiler werden das wahrscheinlich automatisch für Sie tun.
___ answer4390545 ___

Nein - Wenn Sie kein Template-Argument verwenden möchten, deklarieren Sie die Klasse nicht mit einem Template-Parameter. Wenn Sie das Template-Argument für andere Member der Klasse benötigen, aber nicht in %code% benötigen, verschieben Sie %code% aus der Klasse.

    
___ answer4390559 ___

Der Compiler weiß nicht, dass %code% nicht den Typ Parameter %code% verwendet. So wie es ist, müssen Sie dem Compiler immer dann einen Typ geben, wenn Sie %code% verwenden.

Aber wenn ich eine Template-Klasse entwerfe und merke, dass einige Member / Methoden nicht von Template-Parametern abhängig sind, verschiebe ich diese oft in eine Nicht-Template-Basisklasse.

%Vor%

Jetzt sind %code% , %code% und %code% wirklich alle gleich.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ antwort4390572 ___

Sicher. Geben Sie ihm einen Aliasnamen, indem Sie ihn einem Funktionszeiger zuweisen.

    
___ qstntxt ___

Wenn ich:

%Vor%

In diesem Fall ist %code% dasselbe wie %code% , aber ich möchte nicht %code% über den Template-Parameter aufrufen. Gibt es eine Syntax, die den Aufruf von %code% erlaubt, aber nicht den Template-Parameter erfordert?

    
___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ answer4390647 ___

Eine Clodgie funktioniert nicht (wenn Sie die Vererbung nicht verwenden wollen und sie nicht zu einer Nicht-Member-Funktion machen wollen), könnten Sie einen Standardtyp für Ihre Klasse angeben:

%Vor%

HINWEIS: Diese Methode ist jedoch nicht dasselbe wie , %code% oder %code% usw., aber wenn Sie keine Typabhängigkeit in der Funktion haben, dann könnte das obige funktionieren ...

    
___ antwort4390550 ___

Nein, %code% stimmt nicht mit %code% überein. Sie sind wirklich anders. Wenn %code% wirklich unabhängig vom Parameter sein soll, können Sie die Template-Klasse %code% von einer anderen Klasse erben lassen (manchmal auch als Eigenschaft bezeichnet), die %code% als statische Member-Funktion anbietet:

%Vor%

Dann können Sie entweder %code% oder %code% aufrufen.

    
___ tag123staticmethods ___ Methoden, die weder eine Instanz der Klasse erfordern, noch implizit auf die Daten (oder diese, self, Me usw.) einer solchen Instanz zugreifen können. ___
Crazy Eddie 08.12.2010 17:45
quelle
0
___ qstnhdr ___ Wie rufe ich statische Member einer Template-Klasse auf? ___ antwort4390551 ___
  1. Es gibt keine Syntax, um dies zu spezifizieren. Es gibt wenig Grund, A<int>::f() trotzdem zu einer statischen Methode zu machen. Machen Sie stattdessen eine freie Funktion. Wenn Sie aus irgendeinem Grund eine statische Methode erstellen müssen, implementieren Sie sie als freie Funktion und rufen Sie sie einfach auf.
  2. Viele Compiler werden das wahrscheinlich automatisch für Sie tun.
___ answer4390545 ___

Nein - Wenn Sie kein Template-Argument verwenden möchten, deklarieren Sie die Klasse nicht mit einem Template-Parameter. Wenn Sie das Template-Argument für andere Member der Klasse benötigen, aber nicht in A<any_other_type>::f() benötigen, verschieben Sie f() aus der Klasse.

    
___ answer4390559 ___

Der Compiler weiß nicht, dass A nicht den Typ Parameter f() verwendet. So wie es ist, müssen Sie dem Compiler immer dann einen Typ geben, wenn Sie A<type>::f() verwenden.

Aber wenn ich eine Template-Klasse entwerfe und merke, dass einige Member / Methoden nicht von Template-Parametern abhängig sind, verschiebe ich diese oft in eine Nicht-Template-Basisklasse.

%Vor%

Jetzt sind X::f() , %code% und %code% wirklich alle gleich.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ antwort4390572 ___

Sicher. Geben Sie ihm einen Aliasnamen, indem Sie ihn einem Funktionszeiger zuweisen.

    
___ qstntxt ___

Wenn ich:

%Vor%

In diesem Fall ist %code% dasselbe wie %code% , aber ich möchte nicht %code% über den Template-Parameter aufrufen. Gibt es eine Syntax, die den Aufruf von %code% erlaubt, aber nicht den Template-Parameter erfordert?

    
___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ answer4390647 ___

Eine Clodgie funktioniert nicht (wenn Sie die Vererbung nicht verwenden wollen und sie nicht zu einer Nicht-Member-Funktion machen wollen), könnten Sie einen Standardtyp für Ihre Klasse angeben:

%Vor%

HINWEIS: Diese Methode ist jedoch nicht dasselbe wie , %code% oder %code% usw., aber wenn Sie keine Typabhängigkeit in der Funktion haben, dann könnte das obige funktionieren ...

    
___ antwort4390550 ___

Nein, %code% stimmt nicht mit %code% überein. Sie sind wirklich anders. Wenn %code% wirklich unabhängig vom Parameter sein soll, können Sie die Template-Klasse %code% von einer anderen Klasse erben lassen (manchmal auch als Eigenschaft bezeichnet), die %code% als statische Member-Funktion anbietet:

%Vor%

Dann können Sie entweder %code% oder %code% aufrufen.

    
___ tag123staticmethods ___ Methoden, die weder eine Instanz der Klasse erfordern, noch implizit auf die Daten (oder diese, self, Me usw.) einer solchen Instanz zugreifen können. ___
Diego Sevilla 08.12.2010 17:43
quelle
0

Eine Clodgie funktioniert nicht (wenn Sie die Vererbung nicht verwenden wollen und sie nicht zu einer Nicht-Member-Funktion machen wollen), könnten Sie einen Standardtyp für Ihre Klasse angeben:

%Vor%

HINWEIS: Diese Methode ist jedoch nicht dasselbe wie , A<int>::f() oder A<long>::f() usw., aber wenn Sie keine Typabhängigkeit in der Funktion haben, dann könnte das obige funktionieren ...

    
Nim 08.12.2010 17:53
quelle

Tags und Links