有没有更好的方法来声明一个 CStringT<> 的 char 类型的适当实例而不是

Posted

技术标签:

【中文标题】有没有更好的方法来声明一个 CStringT<> 的 char 类型的适当实例而不是【英文标题】:Is there a better way to declare a char-type appropriate instance of a CStringT<> than 【发布时间】:2011-05-14 18:27:20 【问题描述】:

我想要得到的是一个函数,它生成一个适用于给定字符类型(char 或 wchar_t)的 CStringT 实例。

这是一个人为的例子:

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

有人知道这样的实用程序或类似的东西吗?

【问题讨论】:

人们还在使用 CString 编写新代码?呸! 试图澄清:上述工作,但我不得不提供太多我喜欢的论据。我真正想说的是 CStringT。但这无法编译,因为底层 CString 没有为其其余参数提供默认类型,所以我说的比我真正想要的要多得多(而且我不确定它是否有意义其他不一定使用 CRT (ChTraitsCRT) 的项目... 【参考方案1】:

它已经存在,使用 CString(项目设置)、CStringA 或 CStringW。在 17 年多的 Unicode 和专门使用 Unicode 的操作系统之后,非常没有什么理由可以避免正确地进行项目设置。

【讨论】:

有很多时候需要在单个项目中处理窄字符和宽字符的字符串。例如:读/写遗留文件(窄)。串行设备的 I/O(是的,那些仍然存在:请参阅平板绘图仪和样品制造商)。等 设备 I/O 以字节为单位。转换为 8 位字符串,然后是字节的意义不大。【参考方案2】:

让我们看看我是否理解正确,您想根据 char 的类型创建一个字符串 (char /Wchar_t)

template <typename _T>
CStringT <_T, ATL::StrTraitATL <_T, ATL::ChTraitsCRT <_T > > >
make_cstring (_T* __args)

 .. create cstring and return it

【讨论】:

请使用“010101”按钮格式化代码。我已经在这里为你完成了。 基本上。我在我的 OP 中发布的模板就是这样做的。问题部分是“我真的需要自己滚动,还是已经有这样一个设施隐藏在我可以使用的 ATL 代码的英里内,微软将维护它,以便在可预见的未来版本中是正确的他们的编译器?”【参考方案3】:

感谢所有为此提供帮助的人。

这是最能完全满足我需求的答案:

// 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<...> ,这取决于进一步的编译时间选项(例如使用 CRT、使用 MFC 等)。相反,它会生成由 Microsoft 维护的系统提供的 CStringA 或 CStringW,从而为我的代码提供更大的灵活性和面向未来的能力(我希望尽可能多地获得)。

【讨论】:

【参考方案4】:

不要将所有大写字母用于非宏观目的。

为什么不把它放在 ATL 命名空间中并命名为 make_cstring 呢? (见鬼,为什么不直接使用 std::string?)

【讨论】:

ATL 是微软选择的命名空间名称——这不是我做的。 std::string 很有价值,但也有其局限性。其中之一是它与我们已经获得的使用 CString 的大量代码不兼容,它没有真正的缺点,因此,很少或没有动机仅出于取悦语言的目的而重写和重新调试纯粹主义者。 @Mordachai:我指的是模板参数,而不是命名空间名称,我真的很好奇,而不是 OMG 你应该使用 STD STRING! @Mordachai:您提到了可移植性。祝 CString 在 g++ 中编译好运 @DeadMG 我可能有点草率 - 我很抱歉假设你的语气是 OMGBBQ 变体:(

以上是关于有没有更好的方法来声明一个 CStringT<> 的 char 类型的适当实例而不是的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来编写这个 SparkSQL 语句?

有没有更好的方法来排列字符串?

有没有比 `const` 更好的方法来存储大块文本?

有没有更好的方法来访问我的 XML 文档中的子节点?

有没有更好的方法来创建“抽象”线性搜索? [复制]

有没有更好的方法来分配/复制 shared_array