Frage

ein Template-Parameter können in einem anderen Template-Parameter verwendet werden, die es auf diese Weise folgt:

template<typename T, T N>
struct s
{
};

Aber ist es möglich, „T“ zu verweisen, wenn sie deklariert ist nach „N“?

Das funktioniert nicht:

template<T N, typename T>
struct s
{
};

Können wir die Compiler durch vorherige Deklarierung „T“ oder irgendetwas anderes helfen zu tun?

Vielen Dank im voraus.

EDIT: als die ersten beiden Antworten wurden zu fragen: „Warum sind Sie bereit, das zu tun?“ Ich werde das Ziel erklären:

Ich möchte der Compiler ableiten, machen den Typ „T“, um einfacher die Verwendung von Templat Klassen zu machen.

Zum Beispiel:

template<typename T, T A, T B>
struct sum
{
    static T const value = A + B;
};

Diese Vorlage kann auf diese Weise verwendet werden:

sum<int, 1, 2>::value

Aber es wäre besser, wenn es auf diese Weise verwendet werden:

sum<1, 2>::value

Technisch sollte es möglich sein, da die Compiler die Typen von „1“ und „2“ wissen: „int“, und in der Tat verwendet er diese Informationen die beste Überlastung für eine Funktion zu finden. Also von der Vorlage auf diese Weise erklärt:

template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};

könnte der Compiler seine Fähigkeit, verwenden Sie die letzten Parameter von den Informationen durch die erste und die zweiten, zur Verfügung gestellt zu schließen und dann die beste Vorlage finden instanziiert.

War es hilfreich?

Lösung

Wie andere sagen - Nein, das ist nicht möglich, die Compiler den Typen des T aus dem nicht-Typ nicht ableiten können template Argumente (im Fall von Funktionen, folgert sie Typen aus dem Funktion Argumente):

14.8.2.4/12:

  

Eine Vorlage Typ Argument kann nicht von der Art eines nicht-Typ Template-Argument abgeleitet werden.

In jedem Fall wird kein Abzug für die Argumente einer Klassenvorlage sowieso gemacht werden. Ein Beispiel für eine Funktionsvorlage möglicherweise

template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }

In diesem Fall T nicht als int abgeleitet werden - Sie haben es explizit angeben.

Andere Tipps

Sie können nicht. Ich habe nicht den Punkt, warum Sie es auch tun.

Im Folgenden finden Sie Müll, da ich nicht richtig Ihre Frage gelesen haben.

Ja, ich sehe keinen Punkt in dem, was Sie versuchen, entweder zu erreichen.

#include <iostream>

template<typename T, T N>
struct s
{
    T size() { return N; }
};


int main()
{
    s<int, 4> x;
    std::cout << x.size()<< '\n';

    //s<float, 3.14> f; //this doesn't compile
}

Dies kompiliert für mich mit GCC und Comeau Online.

Ich denke, das Problem mit der Art des T ist Sie versuchen, zu verwenden. Nicht-Typ-Vorlage Argumente nur ganzzahlige Typen unterstützen, und dann Zeiger auf Objekte mit externer Bindung (oder so ähnlich und vielleicht ein paar anderen sehr begrenzten Dingen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top