🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
LocaleGuard.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include <clocale> // std::setlocale
25#include <string> // std::string
26#include <stdexcept> // std::runtime_error
27#include "AstUtil/Logger.hpp"
28
29AST_NAMESPACE_BEGIN
30
38{
39public:
43 explicit LocaleGuard(const char* new_locale, int category = LC_ALL)
44 : active_(false)
45 , category_(category)
46 {
47 // 1. 保存当前 locale 的字符串表示
48 const char* old = std::setlocale(category_, nullptr);
49 if (old != nullptr) {
50 old_locale_ = old; // 复制一份字符串
51 }
52 // 2. 尝试设置新 locale
53 if (std::setlocale(category_, new_locale) != nullptr) {
54 active_ = true; // 设置成功,析构时需要恢复
55 } else {
56 // 设置失败,不改变当前 locale
57 aError("failed to set locale '%s'", new_locale);
58 }
59 }
60
61
62 ~LocaleGuard() {
63 if (active_ && !old_locale_.empty()) {
64 std::setlocale(category_, old_locale_.c_str());
65 }
66 }
67
68 // 可选:提前恢复并停止自动恢复(类似 lock_guard 的 release 语义)
69 void release() {
70 active_ = false;
71 }
72 A_DISABLE_COPY(LocaleGuard);
73
74private:
75 bool active_; // 是否需要在析构时恢复
76 int category_; // 影响哪个 locale 类别(LC_ALL, LC_CTYPE 等)
77 std::string old_locale_; // 保存的原 locale 字符串
78};
79
82AST_NAMESPACE_END
用于切换和恢复 locale 的 RAII 类。
定义 LocaleGuard.hpp:38
LocaleGuard(const char *new_locale, int category=LC_ALL)
构造并切换到指定的 locale。
定义 LocaleGuard.hpp:43