Есть ли лучший способ объявить соответствующий экземпляр типа CStringT типа <char, чем - PullRequest
2 голосов
/ 24 ноября 2010

Я пытаюсь получить функцию, которая генерирует экземпляр CStringT <>, который подходит для данного типа символа (char или wchar_t).

Вот надуманный пример:

#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);
}

Я, конечно, могу использовать вышеизложенное (кажется, что оно компилируется), но для читателей моего кода (и, вероятно, для будущей совместимости) было бы намного лучше, если бы я мог использовать что-то вроде:

ATL::make_cstring(psz);

Кто-нибудь знает такую ​​утилиту или что-то подобное?

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

Это уже там, используйте либо CString (настройка проекта), CStringA или CStringW. После 17+ лет Unicode и операционных систем, которые являются исключительно Unicode, осталось очень мало причин, чтобы избежать правильной настройки проекта.

0 голосов
/ 24 ноября 2010

Спасибо всем, кто помог с этим.

Вот ответ, который наиболее полно отвечает моим потребностям:

// 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;
}

Как видите, он полностью генерирует правильную строку CString.тип (CStringA или CStringW), полностью основанный на параметре шаблона (charT).Эта версия имеет дополнительное преимущество: она не пытается явно генерировать CStringT <...>, которая зависит от дополнительных параметров времени компиляции (таких как использование CRT, использование MFC и т. Д.).Вместо этого это приводит к предоставленной системой CStringA или CStringW, которую поддерживает Microsoft, что дает моему коду большую гибкость и обеспечивает его защиту в будущем (я думаю, столько, сколько можно получить).

0 голосов
/ 24 ноября 2010

Посмотрим, правильно ли я понимаю, вы хотите создать строку на основе типа char (char / Wchar_t)

template <typename _T>
CStringT <_T, ATL::StrTraitATL <_T, ATL::ChTraitsCRT <_T > > >
make_cstring (_T* __args)
{
 .. create cstring and return it
}
0 голосов
/ 24 ноября 2010

Не используйте все заглавные буквы для не-макросов.

Почему бы просто не вставить его в пространство имен ATL и вызвать его make_cstring?(черт, почему бы просто не использовать std :: string?)

...