2012-09-26 8 views
5

Das trivial sein sollte, implementieren, so etwas wieGibt es eine Std-Funktion, die nur ihren Parameter zurückgibt?

template<typename T> 
T & as_is(T & t) { return t; } 

Trotzdem würde Ich mag es nicht zu schreiben zu haben (:

ich nicht so etwas auf www.cplusplus.com fanden

. Für diejenigen, die fragen werden "Was machst du da?", Hier ist das Ding. Ich habe eine Klasse, die ASCII-Tabellen erstellt, mit schönen Padding und alles. Ich werde die Details verschonen. Wichtig ist, dass es Strings speichert (es ist also in der Lage zu berechnen, wie viel zu puffern ist. Ich möchte eine Sortierfunktion implementieren und in der Lage sein, der Klasse t zu sagen o Verwenden Sie die Spalte als einen bestimmten Typ. Wenn ich nach einer Spalte von Ints sortieren möchte (die wiederum interne Strings sind), würde ich atoi übergeben. Wenn ich Strings sortiere, möchte ich as_is oder das STL-Äquivalent, falls vorhanden, bestehen.

+4

Vielleicht erfüllt 'std :: forward ' diese Anforderungen? –

+1

@Kerrek: Das ist ein gutes, obwohl Sie die Template-Argumente buchstabieren müssen. – Xeo

Antwort

2

Sie können eine Vorlage nicht übergeben, als ob es eine Funktion wäre, so dass weder std :: forward noch Ihre hypothetische nonstd :: identity-Funktion so wie sie ist (sozusagen) funktionieren. Sie müssen explizit den Zieltyp der setzen verwandeln:

table.SortColumnUsing(3, nonstd::identity<std::string>); 

Das ist ein bisschen hässlich ich scheint, da der Typ in der Template-Spezialisierung ein Merkmal der internen Umsetzung der Tabelle ist, anstatt etwas mit mit dem Typ zu tun, von dem ich erwarte, dass die Tabelle zum Sortieren serialisiert wird. Oder speichern Sie die Spalten nicht wirklich als std :: string.

Wie arbeitet atoi als Typdeskriptor? atoi erwartet einen char *, nicht einen std :: string, und ich dachte nicht, dass Sie int(const char*) implizit in int(const std::string&) konvertieren können. Selbst wenn Sie das tun könnten, welchen Typ verwenden Sie, der sowohl eine int(const std::string&) als auch eine Banana(const std string&) speichern kann. Vielleicht verstehe ich den Kontext Ihrer Frage nicht vollständig, oder alternativ haben Sie einige C++ - Tricks im Ärmel, die ich gerne lernen würde.

Meine Neigung wäre, eine Vergleichsfunktion anstelle einer Konvertierungsfunktion zu übergeben. Das würde zu einem einzigen konstanten Funktionstyp führen, vielleicht bool(const std::string&, const std::string&). Das könnte es auch einfacher machen, z. Groß-/Kleinschreibung oder Gebietsschema-spezifischer String-Vergleich für bestimmte Spalten oder andere benutzerfreundliche Sortier-Hacks (z. B. Ordner am Anfang der Liste platzieren: zuerst prüfen, ob nur einer der Strings ein abschließendes/hat, ansonsten Standardvergleich verwenden) Das löst das Problem der Spezialisierung jedoch nicht wirklich; für den std::string Fall enden Sie noch mit std::less<std::string> (der mindestens besteht.)

Keine große Antwort, ich weiß ... aber es war zu lang für einen Kommentar.

+1

Dies ist eine gute Antwort, da es nach der Ursache geht, nicht das Problem. Das Übergeben einer Umwandlungsfunktion zum Sortieren in "ganzzahliger Reihenfolge" klingt so schlecht, wie es ist, also +1, um eine Vergleichsfunktion vorzuschlagen. – Xeo

+0

Ich übergebe tatsächlich eine Vergleichsfunktion an die aktuelle Sortierfunktion. Ich will (ed) es wegen der Ausführlichkeit des Konstrukts loswerden. Das heißt, ich habe vergessen, dass ich noch '.c_str()' die Strings im 'atoi' des Funktors haben muss, was verhindern würde, dass es unverändert an die Sortierfunktion übergeben wird, wodurch das Beispiel gebrochen wird. – Gabriel

3

Warum nicht die Funktion überladen und nichts weitergeben? Wenn Sie mit MSVC arbeiten, haben sie die identity Klassenvorlage, die eine überladene operator() hat, die den Eingang zurückgibt In der Theorie könnten Sie also std::identity<std::string>() übergeben, aber ich würde sagen, bauen Sie einfach Ihre eigene identity Funktion.

+0

Interessant. Es scheint, dass die Identität nicht MS-spezifisch ist: http://www.sgi.com/tech/stl/identity.html http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++api-4.5/a00497.html – Gabriel

+0

Überladung würde bedeuten, etwas Code zu duplizieren.Um Überschneidungen zu vermeiden, würde die Überladung ohne Parameter die Version mit param aufrufen und Identität geben. Dies würde Bequemlichkeitsmethoden bereitstellen, die Komplexität hinzufügen, ohne irgendwelche Merkmale hinzuzufügen. – Gabriel

+2

@Gabriel war es in einem älteren Entwurf des neuesten Standards, wurde aber fallengelassen. Sie werden es nicht auf GCC 4.6 finden. –

Verwandte Themen