我想要的是一个生成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);
是否有人知道这样的实用程序,或类似的东西?
答案 0 :(得分:2)
它已经存在,使用CString(项目设置),CStringA或CStringW。经过17年以上的Unicode和专用Unicode的操作系统,非常几个原因,以避免项目设置正确。
答案 1 :(得分:0)
让我们看看我是否理解正确,你想根据char的类型创建一个字符串(char / Wchar_t)
template <typename _T>
CStringT <_T, ATL::StrTraitATL <_T, ATL::ChTraitsCRT <_T > > >
make_cstring (_T* __args)
{
.. create cstring and return it
}
答案 2 :(得分:0)
谢谢你,帮助解决这个问题的每个人。
以下是最能完全满足我需求的答案:
// 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;
}
如您所见,它完全基于模板参数(charT)完全生成正确的CString类型(CStringA或CStringW)。此版本具有额外的优点,即不尝试显式生成CStringT&lt; ...&gt;这取决于进一步的编译时间选项(例如使用CRT,使用MFC等)。相反,它会产生系统提供的CStringA或CStringW,这是微软维护的,因此为我的代码提供了更大的灵活性和面向未来的版本(我希望可以获得尽可能多的代码)。
答案 3 :(得分:-1)
不要将所有上限用于非宏目的。
为什么不将它粘贴在ATL命名空间中并将其命名为make_cstring? (地狱,为什么不使用std :: string?)