Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
句柄标准::基本字符串<&燃气轮机;使用不同类型的参数 我想实现一个C++库,和许多其他的LIBS一样,我需要从用户那里获取字符串参数并给出字符串。当前的标准定义了std::string和std::wstring(我更喜欢wstring)。理论上,我必须使用字符串参数实现两次方法: virtual void foo(std::string &) = 0; // convert internally from a previous defined charset to unicode virtual void foo(std::wstring &) = 0; 虚拟void foo(std::string&)=0;//从以前定义的字符集内部转换为unicode 虚拟void foo(std::wstring&)=0;_C++_C++11 - Fatal编程技术网

句柄标准::基本字符串<&燃气轮机;使用不同类型的参数 我想实现一个C++库,和许多其他的LIBS一样,我需要从用户那里获取字符串参数并给出字符串。当前的标准定义了std::string和std::wstring(我更喜欢wstring)。理论上,我必须使用字符串参数实现两次方法: virtual void foo(std::string &) = 0; // convert internally from a previous defined charset to unicode virtual void foo(std::wstring &) = 0; 虚拟void foo(std::string&)=0;//从以前定义的字符集内部转换为unicode 虚拟void foo(std::wstring&)=0;

句柄标准::基本字符串<&燃气轮机;使用不同类型的参数 我想实现一个C++库,和许多其他的LIBS一样,我需要从用户那里获取字符串参数并给出字符串。当前的标准定义了std::string和std::wstring(我更喜欢wstring)。理论上,我必须使用字符串参数实现两次方法: virtual void foo(std::string &) = 0; // convert internally from a previous defined charset to unicode virtual void foo(std::wstring &) = 0; 虚拟void foo(std::string&)=0;//从以前定义的字符集内部转换为unicode 虚拟void foo(std::wstring&)=0;,c++,c++11,C++,C++11,C++0x并没有让生活变得更简单,对于char16\u t和char32\u t,我需要: virtual void foo(std::u16string &) = 0; virtual void foo(std::u32string &) = 0; 虚拟void foo(std::u16string&)=0; 虚拟void foo(std::u32string&)=0; 在内部处理这些不同的类型-例如将所有类型放入私有向量成员-需要转换、包装。。。太可怕了 另一个问题是,如果用户(或我自己)想

C++0x并没有让生活变得更简单,对于char16\u t和char32\u t,我需要:

virtual void foo(std::u16string &) = 0; virtual void foo(std::u32string &) = 0; 虚拟void foo(std::u16string&)=0; 虚拟void foo(std::u32string&)=0; 在内部处理这些不同的类型-例如将所有类型放入私有向量成员-需要转换、包装。。。太可怕了

另一个问题是,如果用户(或我自己)想要使用定制的分配器或定制的特征类:一切都会导致一个全新的类型。例如,要为多字节字符集编写自定义codecvt专门化,该标准规定我必须引入一个自定义state_类型-它需要一个自定义trait类,该类将产生一个新的std::basic_ifstream类型-这与期望std::ifstream&作为参数的接口完全不兼容

一种可能的解决方案是将每个库类构造为一个模板,用于管理用户指定的值类型、特征和分配器。但这太过分了,使得抽象基类(接口)不可能实现

另一个解决方案是只指定一个类型(例如u32string)作为默认值,每个用户都必须使用此类型传递数据。但是现在想想一个使用3个库的项目,第一个库使用u32string,第二个库使用u16string,第三个库使用wstring->HELL


我真正想要的是声明一个方法,就像void foo一样(在这里放上unicode字符串),而不引入我自己的UnicodeString或UnicodeStream类。

如果你不想支持所有东西,总要做出选择,但我个人觉得将输入限制到UTF-8是最简单的。只要使用普通的旧
std::string
,大家都会高兴的。实际上,如果用户在Windows上,那么(您的库的)用户只需要转换为UTF-8,但是有很多方法可以完成这个简单的任务


更新:另一方面,您可以模板化所有代码,并将
std::basic_字符串作为模板保留在整个代码中。如果您根据模板参数的大小做不同的事情,这只会变得混乱。

如果您不想支持所有内容,则必须做出选择,但我个人认为将输入限制为UTF-8是最简单的选择。只要使用普通的旧
std::string
,大家都会高兴的。实际上,如果用户在Windows上,那么(您的库的)用户只需要转换为UTF-8,但是有很多方法可以完成这个简单的任务


更新:另一方面,您可以模板化所有代码,并将
std::basic_字符串作为模板保留在整个代码中。只有根据模板参数的大小做不同的事情时,这才会变得混乱。

char\u traits
确实是随机特征的一个可怕的垃圾桶。每个字符串是否应该预先指定编码机制本身支持的最大文件大小、大小写敏感度和(ugh)状态类型?没有

然而,即使有精心设计的特质,你的要求也是不可能的<由于内部字符类型的大小不同,代码>字符串
wstring
的差异非常显著。要运行任何类型的算法,都需要查询对象的
char\t
。这需要RTTI或虚拟函数,因为
basic\u string
在运行时不(也不应该)维护该信息

一种可能的解决方案是将每个库类构造为一个模板,用于管理用户指定的值类型、特征和分配器。但这太过分了,使得抽象基类(接口)不可能实现

这是唯一完整的解决方案。模板实际上可以很好地处理抽象基类:许多模板可以从非模板抽象基类派生,或者也可以对基类进行模板化。然而,由于编写完全通用的代码的敏感性和繁琐性,即使不是站不住脚,也很困难

另一种解决方案是只指定一种类型(例如u32string)作为默认值,每个用户都必须使用此类型传递数据。但是现在想想一个使用3个库的项目,第一个库使用u32string,第二个库使用u16string,第三个库使用wstring->HELL

这就是为什么我对C++11“改进的”Unicode支持感到害怕。它简化了与文件数据的直接交互,不鼓励抽象为通用的
wchar\t
内部格式。最好要求UTF-16和UTF-32使用特定的编解码器VT,并指定
wchar\u t
必须至少为21位。而在“C++”接口中只有“哑”<代码> char < /> >“智能”>代码> WCARGYTT 库之前,我们可能不得不与其他宽度竞争——而 CAR16.T.只是一个即时红旗。 但是,这是今后的事情


如果您最终使用了许多不兼容的库,而问题是在需要不同格式的函数之间穿梭数据,那么请编写一个实用程序,将数据转换为您选择的常用格式,例如
wstring
。这个实用程序可以是一个模板,它对您需要的每种不兼容的格式都有显式的专门化,也可以是一组非模板化的类。

char\u traits
确实是一个令人绝望的随机特征垃圾箱。每个字符串是否应该预先指定编码机制本身支持的最大文件大小、大小写敏感度和(ugh)状态类型?没有

然而,即使使用精心设计的t,您所要求的也是不可能的