GCC <5 是否有 std::p ut_time 的内置替代方案?
Is there a builtin alternative to std::put_time for GCC <5?
我暂时停留在GCC4.8上。我想将当前时间打印为秒以外的其他时间。如果put_time
有效,我的代码将很简单,如下所示:
std::cout << std::setw(24) << std::put_time(c_time, "[%T%z %F] ");
如果没有put_time
,我将不得不手动访问c_time
的元素并手动进行所有格式化,这将是a**的痛苦,如果可能的话,我宁愿避免。请注意,这并不意味着我永远不想以任何方式与 C 交互,即使是间接的 - 如果可能的话,我只想避免直接使用 C 进行编码。
但是,除了strftime
之外,我找不到任何替代std::put_time
,我想避免这样做,因为它需要几乎两倍的代码行,并且至少对我来说更难阅读。另外,这是C++,而不是 C,所以我想尽可能避开 C 函数。
我错过了什么吗?是否有在 GCC 4.8 下工作的std::put_time
的内置替代方案?
请注意,它不必以完全相同的方式工作 - 如果它直接将其打印到输出,而不是流操纵器,那也很好,返回包含格式化时间的std::string
的函数也是如此。
我已经做了很多谷歌搜索并找到了<chrono>
,但这不起作用,因为它没有任何自动格式化时间的东西。我仍然需要手动完成,而且我很确定这会有更多的工作,因为我必须将自纪元以来的秒数解析为年、月、日等。
除了put_time
chrono
或iomanip
库中提供的时间输出之外,没有其他函数。
ctime
库确实提供:strftime
、ctime
和asctime
。
由于 http://stackoverflow.com 不允许有关查找 3个第三方库的问题,我猜您只是在要求有人指导您使用strftime
?std::put_time(c_time, "[%T%z %F] ")
可以按以下格式编写:
char foo[24];
if(0 < strftime(foo, sizeof(foo), "[%T%z %F] ", c_time)) cout << foo << endl;
另外,这是C++,而不是 C,所以我想尽可能避开 C 函数。
这是一种非常愚蠢的心态。put_time
在引擎盖下使用std::strftime
。
分机#10
返回:未指定类型的对象...其中函数
f
定义为:
template <class charT, class traits>
void f(basic_ios<charT, traits>& str, const struct tm* tmb, const charT* fmt) {
/* ... */
typedef time_put<charT, Iter> TimePut;
/* ... */
}
time_put
的定义在locale.time.put.virtuals#1中:
效果:将参数
t
的内容格式化为放置在输出序列s
上的字符。格式由 参数格式和修饰符,解释为格式相同 标准库函数的字符串参数中的说明符strftime()
......
另一种解决方案是从后来的 GCC 标头中剥离std::put_time
的定义,因为底层设施std::time_put
仍然存在于 GCC 4.8 中,并且定义不是很复杂。这是从GCC 7.4的<iomanip>
复制的,并为清楚起见进行了编辑:
#if __GNUC__ && __GNUC__ < 5
#include <ostream> // std::basic_ostream
#include <ios> // std::ios_base
#include <locale> // std::use_facet, std::time_put
#include <iterator> // std::ostreambuf_iterator
template<typename CharT>
struct _put_time
{
const std::tm* time;
const char *fmt;
};
template<typename CharT>
inline _put_time<CharT>
put_time(const std::tm* time, const CharT* fmt)
{ return { time, fmt }; }
template<typename CharT, typename Traits>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits> &os, _put_time<CharT> f)
{
typedef typename std::ostreambuf_iterator<CharT, Traits> Iter;
typedef std::time_put<CharT, Iter> TimePut;
const CharT* const fmt_end = f.fmt + Traits::length(f.fmt);
const TimePut& mp = std::use_facet<TimePut>(os.getloc());
std::ios_base::iostate err = std::ios_base::goodbit;
try {
if (mp.put(Iter(os.rdbuf()), os, os.fill(), f.time, f.fmt, fmt_end).failed())
err |= std::ios_base::badbit;
}
catch (...) {
err |= std::ios_base::badbit;
}
if (err)
os.setstate(err);
return os;
}
#endif
- 内置函数可查看CPP中的成员变量
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何从 c++ 中类中内置的数组继承
- 如何捕获 C++ 内置异常对象
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 何时包含内置类型和运算符的标头?
- 基本类型与内置类型有什么区别C++
- 指内置类型的文字
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- 像自定义类一样构造的指针(内置类型)如何工作?
- 内置类型与用户定义的类型 C++
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- C++内置类型的基于类型的调度
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?