2016-07-15 34 views
0

Statt11 C++, vs typedef, templatized

typedef struct 
{ 
double x,y; 
} Point; 

C++ 11 unterstützt

using Point = struct {double x, y;}; 

Leider ist dieser Ansatz für den Typ T nicht funktioniert

template <typename T> 
using Point = struct {T x, y;}; 

Gibt es eine Möglichkeit, das Problem zu lösen?

+7

aber ... aber warum ... warum würdest du das überhaupt machen wollen? Sogar dein ursprünglicher 'typedef' ist sinnlos (der Name ist leicht ironisch). –

Antwort

4

using Point = ...; ist eine Art Alias ​​(formal nur 'alias' genannt). Das heißt, es ist nur eine andere Syntax für typedef, wo der beteiligte Typ in ... benannt ist.

template<typename T> using Point = ...; ist ein Alias ​​Vorlage, wo die beteiligten Typ wieder in ... gestattet.

Was beide Aliase und Aliasvorlagen gemeinsam haben, ist, dass beide auf eine Typ-ID (C++ 11 [basic.scope.pdecl] p3) verweisen müssen. Typ-IDs müssen wiederum Typen benennen. (Gehen Sie Abbildung.)

Das Problem ist, dass template<typename T> struct {T x, y;} ist kein Typ, aber eine Klassenvorlage, und als gerade etablierte Alias-Vorlagen müssen auf Typen verweisen. Wie Sie den Code an sich ändernde Ihre Problem zu lösen, habe ich keine Ahnung, wie Sie nicht gesagt haben, was es ist ...; -], dass Bezüglich bitte What is the XY problem?

+0

@ ildjarn: Danke für die Erklärung. – justik

3

Gibt es einen Grund, warum Sie in diesem Fall einen Typalias verwenden möchten? Wenn das Schlüsselwort struct nicht vorangestellt werden soll, ist dies in C++ nicht der Fall.

Sie würden sie nur direkt definieren: struct Point { double x, y; };.

Gleiche mit der Vorlage Fall:

template <typename T> 
struct Point { T x, y; }; 
0

ich etwas nicht einverstanden mit der Sprache lawyering sehen in andere Antworten, also habe ich beschlossen, mein eigenes zu schreiben.

Kurz gesagt, Sie können template <typename T> using Point = struct {T x, y;}; aus dem gleichen Grund nicht verwenden, den Sie template <typename T> struct {T x, y;}; nicht verwenden können.

Alias ​​Vorlage ist immer noch eine Vorlage. Und obwohl der Standard dies nicht explizit angibt, impliziert dies, dass eine Vorlage einen Namen haben sollte (siehe [temp]/4 - Ein Vorlagenname hat eine Verknüpfung ...). Welche Sie nicht zur Verfügung stellen.

Also nein, Sie können das Problem nicht lösen, ohne einen Namen anzugeben. Sie können aber auch nicht einfach einen Namen in eine Alias-Deklaration schreiben: template <typename T> using Point = struct P {T x, y;};. Der Standard verbietet dies explizit ([dcl.typedef]/2 - Der defining-type-specifier-seq der defining-type-ID darf keine Klasse oder Enumeration definieren).

Das einzige, was Sie so etwas wie dies aussehen kann:

template <typename T> 
struct Point {T x, y;}; 
template <typename T> 
using PointAlias = Point<T>; 

die, wie Sie sehen können, ist sinnlos (es sei denn, natürlich, Ihre Point mehrere Template-Argumente übernimmt, in diesem Fall, Sie kann eine nette Alias-Vorlage machen).

So Stick mit einfachen template <typename T> struct Point {T x, y;};. Es macht genau dasselbe wie Ihre "vorgeschlagene" Syntax.