C ++ Template-Spezialisierung mit nicht int Abholung
-
06-07-2019 - |
Frage
Ich habe den folgenden Code:
template <typename T> LuaCall& operator>>(T) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
template <> LuaCall& operator>><int&>(int& val) { mResults.push_back(std::make_pair(LUA_RESULT_INTEGER, (void *)&val)); return *this; }
template <> LuaCall& operator>><float&>(float& val) { mResults.push_back(std::make_pair(LUA_RESULT_FLOAT, (void *)&val)); return *this; }
template <> LuaCall& operator>><double&>(double& val) { mResults.push_back(std::make_pair(LUA_RESULT_DOUBLE, (void *)&val)); return *this; }
template <> LuaCall& operator>><bool&>(bool& val) { mResults.push_back(std::make_pair(LUA_RESULT_BOOLEAN, (void *)&val)); return *this; }
template <> LuaCall& operator>><std::string&>(std::string& val) { mResults.push_back(std::make_pair(LUA_RESULT_STRING, (void *)&val)); return *this; }
template <> LuaCall& operator>><LuaNilStruct>(LuaNilStruct) { mResults.push_back(std::make_pair(LUA_RESULT_NIL, (void *)NULL)); return *this; }
Und dann:
int abc;
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333 >> abc;
Ich will es irgendwie wie cin arbeiten >> tut, dh es abc der Rückgabewert der Funktion lua schreiben muss. Also muss ich seine Adresse .. aber es Standardwerte auf der Standardvorlage. Was mache ich falsch? Es ist sicherlich eine Möglichkeit, dies zu tun, da cin tut genau das.
Danke!
Hinweis wem auch immer veränderte das% 's auf >>: Ich habe es wieder geändert, da es so, wie es ist: D Der Code ruft den Lua Funktionstest ( ‚test‘, 5, nil, 2,333) und speichere den Rückgabewert zu abc. % 'S sind für die Parameter der Funktionen, >>' s sind für den Rückgabewert (e).
template <typename T>
LuaCall& operator%(T val) {
mLua->Push(val);
++mArguments;
return *this;
}
Lösung
You'v geschrieben Operator >> als unärer Operator, aber es ist ein binärer Operator. LeftHandSide >> RightHandSide
.
Das Formular std::cout <"Hello" << " world";
daher ist (operator<<(operator<<(std::cout, "Hello"), " world)
; -. Die erste <<
zurück std :: cout für die Verwendung als der linken Seite des zweiten <<
Das eigentliche Problem ist, dass in Ihrem Code Lookup geschieht wie folgt:
- candiate Funktionen bestimmt sind (nur ein Kandidat, der Vorlage)
- T abgeleitet wird. Bestimmen Sie
- die Spezialisierung (falls vorhanden) zu instanziiert.
In Schritt 2 T == int. In Schritt 3 gibt es keine Spezialisierungen für T==int
so die Basisvorlage ausgewählt wird und instanziiert. Sie könnten eine Überlastung verwenden statt einer Spezialisierung wollen. Die Überlastung wäre eine bessere Übereinstimmung in Schritt 1, so dass Sie nicht einmal auf den Punkt der Vorlage Argument Abzug bekommen
Andere Tipps
Sie können keine konstanten Werte ("test" , 5 or 2.333
) verwenden, bei denen Referenzen zu erwarten sind. Ändern Sie die Vorlage und Parametertyp Ihres operator>>
bis (int, float
etc.), wenn Sie dieses Verhalten möchten.
Zum einen ist operator>>
ein binär Operator. Das heißt, es zwei Argumente zu übernehmen hat. Das erste Argument muss sein, was auch immer ist die Art von
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333
Seit diesem Zurückgegeben LuaCall&
, nehme ich an, dass das, was das Ergebnis dieses Aufruf (und damit linkes Argument) ist.
Von dieser mResult
nehme ich an, dass Sie diesen Operator als Klassenmitglied zu tun versuchen. Aber ich glaube nicht, können Sie Mitglied Vorlagen spezialisieren.
Schließlich, ich glaube nicht, dass Sie für Referenztypen spezialisieren sollen. Diese
template <> LuaCall& operator>><int>(int val);
tun sollte,