5 Stimmen

Was ist der ISO-C++-Weg, um direkt eine Konvertierungsfunktion auf Verweis auf Array zu definieren?

Gemäß dem Standard hat eine Konvertierungsfunktion eine Funktions-ID operator umwandlungstyp-id was etwa so aussehen würde, operator char(&)[4] Das glaube ich. Aber ich kann nicht herausfinden, wo ich die Funktionsparameterliste einfügen soll. gcc akzeptiert keine der folgenden Optionen operator char(&())[4] o operator char(&)[4]() oder irgendetwas anderes, das mir einfällt.

Jetzt scheint der gcc zu akzeptieren (&operator char ())[4] aber Clang tut das nicht, und ich neige dazu, es auch nicht zu tun, da es nicht zur Grammatik zu passen scheint, wie ich sie verstehe.

Ich möchte nicht mit einem typedef weil ich vermeiden möchte, den Namespace damit zu verschmutzen.

9voto

Johannes Schaub - litb Punkte 479831

Sie können Identität verwenden

template<typename T>
struct identity { typedef T type; };

struct sample {
  operator identity<char[4]>::type &() {
    ...
  }
};

Sie haben Recht, dass Funktions- und Arraydeklaratoren in Konvertierungsfunktionen nicht funktionieren. Dies ist auch bekannt und wird in dieser Ausgabe Bericht . Ich denke jedoch, dass C++0x bereits eine Lösung für das bietet, was sie dort diskutieren

struct sample {
  template<typename T>
  using id = T;

  template<typename T, int N>
  operator id<T[N]> &() {
    ...
  }
};

Anders als die identity y typedef Ansatz ermöglicht dies T y N abgeleitet werden, denke ich.

4voto

AnT Punkte 300728

C++ bietet dafür keine Syntax. Dies ist einer der Fälle, in denen Sie haben um einen Typedef-Namen für den Typ zu verwenden.

Um den Namespace nicht zu verschmutzen, ist es völlig in Ordnung, den typedef-Namen innerhalb der Klasse zu deklarieren

struct S {
  int a[4];

  typedef int A[4];
  operator A&() { return a; }
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X