有没有更好的方法来声明CStringT的char类型适当的实例<>比

时间:2010-11-23 22:02:21

标签: c++ visual-studio-2008 mfc atl

我想要的是一个生成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 个答案:

答案 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?)