【问题标题】:Where is the definition of libc++ ios_base::clear?libc++ ios_base::clear 的定义在哪里?
【发布时间】:2014-02-13 19:04:39
【问题描述】:

在 libc++ 标头中,<ios>,可在此处查看:

https://github.com/llvm-mirror/libcxx/blob/master/include/ios

class ios_base 有两个声明,“libcpp 版本”有一个clear 方法,ios_base::clear() 而另一个没有。这是一个公开的方法,这里不再赘述:

http://en.cppreference.com/w/cpp/io/ios_base

此外,在上面引用的实现中,basic_ios::clear() 调用了ios_base::clear(),但它似乎没有在任何地方定义。在 libstdc++ 中,它的实现如下所示:

http://repo.or.cz/w/official-gcc.git/blob/HEAD:/libstdc%2B%2B-v3/include/bits/basic_ios.tcc

所以我的问题是:

1) 为什么 libc++ 中有一个公共的ios_base::clear() 方法?

2) 在哪里可以找到 basic_ios::clear() 在 libc++ 中的实现方式?

【问题讨论】:

标签: c++ libc++


【解决方案1】:

我猜你可以怪我。

我发现抛出异常的代码量并不小。因此,我喜欢在可能的情况下概述可放入源中的函数。

basic_ios::clear() 有时必须抛出异常,也是一个模板类。如果我没记错的话,这让我很恼火,因为rdstate 显然不依赖于basic_ios 模板参数:CharT, Traits。所以我在基类(ios_base)中实现了rdstate,这样任何关联的非内联代码都可以被basic_ios的所有实例共享。

正如sty 正确指出的那样,ios_base::clear() 在 src/ios.cpp 中实现。它在ios_base 中声明为protected,然后basic_ios::clear() 只是对这个常见实现的内联转发。

简而言之:“为什么”是代码大小优化。

【讨论】:

  • 有点像 SCARY 迭代器,但功能不同。
  • 是的,完全正确。这是在我知道 SCARY 是什么之前写的。但是想法是一样的:将代码推送到尽可能少的模板参数(尤其是应该概述的代码)。使用 SCARY 迭代器有一个真正的功能优势。但在这里,它纯粹是为了代码大小优化。
猜你喜欢
  • 2015-02-26
  • 2013-04-05
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多