2010-11-23 5 views
2

zu deklarieren Was ich versuche, ist eine Funktion, die eine CStringT <> generiert, die für einen bestimmten Typ von Zeichen geeignet ist (char oder wchar_t).Gibt es eine bessere Möglichkeit, eine char-type entsprechende Instanz eines CStringT <> als

Hier ist ein konstruiertes Beispiel:

#include <atlstr.h> 

template <typename CHAR_T> 
inline 
CStringT< CHAR_T, ATL::StrTraitATL< CHAR_T, ATL::ChTraitsCRT<CHAR_T> > > 
AsCString(const CHAR_T * psz) 
{ 
    return CStringT< CHAR_T, ATL::StrTraitATL< CHAR_T, ATL::ChTraitsCRT<CHAR_T> > >(psz); 
} 

ich sicherlich die oben verwenden kann (es scheint zu kompilieren), aber es wäre viel schöner für die Leser meines Codes (und wahrscheinlich für zukünftige Kompatibilität), wenn ich verwenden könnte so etwas wie:

ATL::make_cstring(psz); 

Ist jemand bewusst ein solches Dienstprogramm oder etwas Vergleichbares?

+0

Die Leute schreiben immer noch neuen Code mit CString? Bläh! –

+0

Um zu klären: das obige funktioniert, aber ich musste viel zu viele Argumente für meinen Geschmack liefern. Was ich wirklich will, ist CStringT . Aber das kann nicht kompiliert werden, da der zugrundeliegende CString <> keine Standardtypen für den Rest seiner Argumente liefert, also sage ich viel mehr, als ich wirklich will (und ich bin mir nicht sicher, ob das Sinn macht für andere Projekte, die nicht unbedingt die CRT (ChTraitsCRT) ... – Mordachai

Antwort

0

danken Ihnen, jeder, der mit dieser geholfen.

Hier ist die Antwort, dass die meisten völlig meine Bedürfnisse antwortet:

// generates the correct CString type based on char_T 
template <typename charT> 
struct cstring_type 
{ 
    // compile time error if no matching CStringT<> for charT 
}; 

template <> 
struct cstring_type<char> 
{ 
    typedef CStringA type; 
}; 

template <> 
struct cstring_type<wchar_t> 
{ 
    typedef CStringW type; 
}; 

#define CSTRINGTYPE(T) typename cstring_type<T>::type 

// returns an instance of a CStringA or CStringW based on the given char_T 
template <typename charT> 
inline CSTRINGTYPE(charT) make_cstring(const charT * psz) 
{ 
    return psz; 
} 

Wie man sehen kann, erzeugt er vollständig die richtige CString-Typ (entweder CStringA oder CStringW) basiert vollständig auf dem Template-Parameter (Grafik). Diese Version hat den zusätzlichen Vorteil, dass Sie nicht explizit versuchen, einen CStringT < ...> zu generieren, der von weiteren Kompilierzeitoptionen abhängt (z. B. Verwendung von CRT, Verwendung von MFC usw.). Stattdessen führt es zu dem vom System bereitgestellten CStringA oder CStringW, den Microsoft beibehält, und gibt meinem Code somit eine größere Flexibilität und Zukunftssicherheit (soweit ich es erwarte, erwarte ich).

-1

Verwenden Sie nicht alle Großbuchstaben für Nicht-Makrozwecke.

Warum nicht einfach in den ATL-Namespace stecken und es make_cstring nennen? (Hölle, warum nicht einfach std :: string?)

+0

ATL ist der Namespace-Namen, den Microsoft wählte - es ist nicht mein Tun. – Mordachai

+2

Std :: String ist wertvoll, aber es hat seine Grenzen. Einer von denen ist dass es kein Plug-in ist, das mit den vielen Codes kompatibel ist, die wir bereits haben, die CString verwenden, die keine wirklichen Nachteile haben, daher wenig oder keine Motivation zum Neuschreiben und Re-Bug für den alleinigen Zweck, Sprachpuristen zu erfreuen – Mordachai

+0

- 1 Deine Antwort adressiert mein Problem nicht – Mordachai

2

Es ist schon da, verwenden Sie entweder CString (Projekteinstellung), CStringA oder CStringW. Nach 17 Jahren Unicode und Betriebssystemen, die ausschließlich Unicode sind, gibt es sehr einige Gründe übrig, um zu vermeiden, dass die Projekteinstellung richtig.

+0

Es gibt viele Male, wenn es notwendig ist, mit Strings von engen und breite Zeichen in einem Projekt, zum Beispiel: Lesen/Schreiben von Legacy-Dateien (schmal), I/O zu einem seriellen Gerät (Ja, die existieren noch: siehe Flachbett-Plotter & Sampler) usw. – Mordachai

+0

Device I/O ist in Bytes. Wenig Punkt beim Konvertieren in 8-Bit-Strings, dann Bytes. –

0

Mal sehen, ob ich es richtig verstehe, Sie wollen einen String erstellen, basierend auf der Art der Zeichen (char/Wchar_t)

template <typename _T> 
CStringT <_T, ATL::StrTraitATL <_T, ATL::ChTraitsCRT <_T > > > 
make_cstring (_T* __args) 
{ 
.. create cstring and return it 
} 
+0

Bitte verwenden Sie die "010101" -Taste, um Code zu formatieren. Ich habe dies für Sie hier getan. –

+0

Grundsätzlich. Die Vorlage, die ich in meinem OP veröffentlicht tut dies Frage-Teil ist "Muss ich wirklich meine eigene rollen, oder gibt es bereits eine solche Einrichtung versteckt in den Meilen von ATL-Code, die ich nur verwenden kann, die Microsoft beibehalten würde, so dass es in absehbarer Zukunft stimmt." Bezug auf ihren Compiler? " – Mordachai

Verwandte Themen