小编zeu*_*xcg的帖子

自定义容器应该有免费的开始/结束功能吗?

当创建一个按照通常规则播放的自定义容器类(即使用STL算法,使用性能良好的通用代码等)时,在C++ 03中实现迭代器支持和成员开始/结束函数就足够了.

C++ 11引入了两个新概念 - 基于范围的for循环和std :: begin/end.基于范围的for循环理解成员开始/结束函数,因此任何C++ 03容器都支持基于范围的开箱即用.对于算法,推荐的方法(根据Herb Sutter的'Writing modern C++ code')是使用std :: begin而不是member function.

但是,此时我不得不问 - 是否建议调用完全限定的begin()函数(即std :: begin(c))或依赖ADL并调用begin(c)?

在这种特殊情况下,ADL似乎毫无用处 - 因为如果可能的话,std :: begin(c)委托给c.begin(),通常的ADL好处似乎不适用.如果每个人都开始依赖ADL,那么所有自定义容器都必须在其必需的命名空间中实现额外的begin()/ end()自由函数.但是,有几个消息来源似乎暗示对开始/结束的不合格调用是推荐的方式(即https://svn.boost.org/trac/boost/ticket/6357).

那么C++ 11的方式是什么?容器库作者是否应该为其类编写额外的开始/结束函数,以便在没有使用namespace std的情况下支持不合格的开始/结束调用; 或者使用std :: begin;?

c++ containers iterator argument-dependent-lookup c++11

58
推荐指数
1
解决办法
4928
查看次数

C++库中的文件打开界面是否应该在Windows上使用UTF-8?

我正在开发一个库(pugixml),除其他外,它使用窄字符C字符串为XML文档提供文件加载/保存API:

bool load_file(const char* path);
bool save_file(const char* path);
Run Code Online (Sandbox Code Playgroud)

目前路径是逐字传递给的fopen,这意味着在Linux/OSX上你可以传递一个UTF-8字符串来打开文件(或任何其他有效路径的字节序列),但在Windows上你必须使用Windows ANSI编码 - UTF-8不起作用.

文档数据(默认情况下)使用UTF-8表示,因此如果您有一个带有文件路径的XML文档,您将无法将从文档中检索到的路径传递给load_file按原样运行 - 或者更确切地说,这不会在Windows上工作.该库提供了使用的替代函数wchar_t:

bool load_file(const wchar_t* path);
Run Code Online (Sandbox Code Playgroud)

但是使用它们需要额外的努力来将UTF8编码为wchar_t.

一种不同的方法(由SQlite和GDAL使用 - 不确定是否有其他C/C++库这样做)涉及在Windows上将路径视为UTF-8(可通过将其转换为UTF-16并使用a wchar_t-aware函数喜欢_wfopen打开文件).

我可以看到不同的利弊,我不确定哪种权衡是最好的.

一方面,在所有平台上使用一致的编码肯定是好的.这意味着您可以使用从XML文档中提取的文件路径来打开其他XML文档.此外,如果使用该库的应用程序采用UTF-8,则在通过库打开XML文件时不必进行额外的转换.

另一方面,这意味着文件加载的行为不再与标准函数的行为相同 - 因此通过库的文件访问不等同于通过标准fopen/的文件访问std::fstream.似乎虽然有些库采用UTF-8路径,但这在很大程度上是一个不受欢迎的选择(这是真的吗?),因此如果应用程序使用许多第三方库,它可能会增加混乱而不是帮助开发人员.

例如,传递argv[1]load_file目前适用于使用Windows的系统的locale编码的编码路径(例如,如果你有一个俄罗斯的区域,那么你可以加载与俄罗斯的名字,如任何文件,但你不能用日文字符加载文件).切换到UTF-8意味着只有ASCII路径才能工作,除非您以某种其他Windows特定方式检索命令行参数.

当然,对于图书馆的一些用户来说,这将是一个重大改变.

我在这里错过了什么重点吗?是否有其他图书馆采用相同的方法?什么是更好的C++ - 在文件访问中始终不一致,或争取统一的跨平台行为?

请注意,问题是关于打开文件的默认方式 - 当然没有什么能阻止我用_utf8后缀添加另一对函数或以其他方式指示路径编码.

c++ windows unicode encoding utf-8

9
推荐指数
1
解决办法
1024
查看次数

XmlDocument混合内容漂亮打印行为背后的基本原理是什么?

当漂亮地打印混合内容节点时,.NET XmlDocument有一个有趣的行为XmlDocument.Save(TextWriter).

行为可以概括为"一旦漂亮的打印机遇到文本节点,它就会禁用当前子树的其余部分的缩进和自动换行".

这是一个例子(http://ideone.com/b1WxD7):

<?xml version='1.0'?>
<root><test><child1/><child2/>foo<child3><child4/></child3></test></root>
Run Code Online (Sandbox Code Playgroud)

非常印刷

<?xml version="1.0"?>
<root>
  <test>
    <child1 />
    <child2 />foo<child3><child4 /></child3></test>
</root>
Run Code Online (Sandbox Code Playgroud)

这种行为似乎不正确也不直观.为什么XmlDocument会那样工作?

.net xml pretty-print

5
推荐指数
1
解决办法
85
查看次数