2016-04-06 10 views
3

Beispiel:Gibt es eine Möglichkeit, std :: array mit Literalen oder Initialisierungslisten zum Vergleich auf die gleiche Weise wie für die Zuweisung zu verwenden?

std::array<float, 3> vec; 

Wir tun können ...

vec = {1.1, 1.2, 1.3}; 

Warum können wir nicht tun, auch die folgende, zum Vergleich?

vec == {1.1, 1.2, 1.3} 

Stattdessen scheint es, dass wir zu tun haben ...

vec == std::array<float, 3>({1.1, 1.2, 1.3}) 

... oder etwas ähnliches.

Typedef'ing erlaubt es mir, so etwas wie zu tun ...

typedef std::array<float, 3> vector; 
vec == vector({1.1, 1.2, 1.3}) 

Aber ist es eine Möglichkeit, nur tun, um ...?

vec == {1.1, 1.2, 1.3} 

Kann ich operator== überladen, um dies zu erreichen? Es scheint, dass der Compiler wissen sollte {1.1, 1.2, 1.3} als was auch immer auf der linken Seite der == zu interpretieren ist. Es tut es für =. Warum nicht für ==?

+0

Hier ist eine andere verwandte Frage: [Können Operatoren für initializer_list Literale überladen werden?] (Http://stackoverflow.com/questions/14370043/can-operators-be-overloaded-for-initializer-list-literals) – Pulseczar

+0

Die ausgewählte Antwort hier meine Frage zufrieden, obwohl die Antwort dokumentarische Unterstützung fehlte: [Inhalt des STL-Containers mit einer Initialisiererliste vergleichen] (http://stackoverflow.com/questions/33781070/compare-stl-container-contents-to-an- Initialisierer-Liste) Die dokumentarische Unterstützung scheint in dieser Antwort zu sein: [Initialisiererlisten und RHS von Betreibern] (http://stackoverflow.com/questions/11420448/initializer-lists-and-rhs-of-operators) – Pulseczar

Antwort

1

ohne Alias ​​können Sie decltype verwenden, um die Liste

vec == decltype(vec){{1.1, 1.2, 1.3}}; 

Sie explizit operator== konvertieren nennen können, aber Sie die Liste mit dem Vergleichsoperator nicht implizit konvertieren können.

operator==(vec, {{1.1, 1.2, 1.3}}); 

Die einzige andere Option, die ich von std::equal_to wäre denken kann, aber das ist hässlicher:

std::equal_to<decltype(vec)>{}(vec, {{1.1, 1.2, 1.3}}); 

This answer den Standard zitiert, wo es heißt, was ein initializer_list kann für verwendet werden, sind die Betreiber nicht in diese Liste.

+2

Ja , aber die Frage ist "Warum können wir nicht auch Folgendes tun ...". Warum, wirklich? Was ist der grundlegende Unterschied zwischen 'vec = {1, 2, 3}' und 'vec == {1, 2, 3}'? Die Tatsache, dass '=' implizit deklariert und '==' vom Benutzer deklariert wird? – AnT

+0

In jedem Fall wäre eine spezielle 'cmp'-Funktion, die an' std :: equal (v.begin(), v.end(), il.begin(), il.end()) 'delegiert, am besten es vermeidet das Kopieren. – TemplateRex

+0

Ok, so beantwortet das verlinkte Duplikat meine Frage: Der Zuweisungsoperator wird explizit durch die Sprachspezifikation behandelt. – AnT