当前位置: 首页 > news >正文

网站开发语言开发企业网站建设要多

网站开发语言开发,企业网站建设要多,在建项目查询在哪里查,温州住房建设网站Godot 4的主要字符串类型为String,已经设计得比较完善了,但有一个问题,格式化这块没怎么考虑。 String中有一个format函数,但这个函数只有两个参数,这咋用? String String::format(const Variant &va…

Godot 4的主要字符串类型为String,已经设计得比较完善了,但有一个问题,格式化这块没怎么考虑。

String中有一个format函数,但这个函数只有两个参数,这咋用?

String String::format(const Variant &values, String placeholder) const {String new_string = String(this->ptr());if (values.get_type() == Variant::ARRAY) {Array values_arr = values;for (int i = 0; i < values_arr.size(); i++) {String i_as_str = String::num_int64(i);if (values_arr[i].get_type() == Variant::ARRAY) { //Array in Array structure [["name","RobotGuy"],[0,"godot"],["strength",9000.91]]Array value_arr = values_arr[i];if (value_arr.size() == 2) {Variant v_key = value_arr[0];String key = v_key;Variant v_val = value_arr[1];String val = v_val;new_string = new_string.replace(placeholder.replace("_", key), val);} else {ERR_PRINT(String("STRING.format Inner Array size != 2 ").ascii().get_data());}} else { //Array structure ["RobotGuy","Logis","rookie"]Variant v_val = values_arr[i];String val = v_val;if (placeholder.find("_") > -1) {new_string = new_string.replace(placeholder.replace("_", i_as_str), val);} else {new_string = new_string.replace_first(placeholder, val);}}}} else if (values.get_type() == Variant::DICTIONARY) {Dictionary d = values;List<Variant> keys;d.get_key_list(&keys);for (const Variant &key : keys) {new_string = new_string.replace(placeholder.replace("_", key), d[key]);}} else {ERR_PRINT(String("Invalid type: use Array or Dictionary.").ascii().get_data());}return new_string;
}

查找使用例子,都是这种效果

一看就懵。哪里有之前用的带%s %d...之类的格式化用得舒服。

动手实现一个

template <typename... Args>
static std::string str_format(const std::string &format, Args... args) {auto size_buf = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;std::unique_ptr<char[]> buf(new (std::nothrow) char[size_buf]);if (!buf)return std::string("");std::snprintf(buf.get(), size_buf, format.c_str(), args...);return std::string(buf.get(), buf.get() + size_buf - 1);
}template <typename... Args>
static String str_format(const std::u32string &format, Args... args) {auto size_buf = std::snprintf(nullptr, 0, TDrString::Convert_u32String_stdString(format).c_str(), args...) + 1;std::unique_ptr<char[]> buf(new (std::nothrow) char[size_buf]);if (!buf)return String(U"");std::string strFormat = TDrString::Convert_u32String_stdString(format);std::snprintf(buf.get(), size_buf, strFormat.c_str(), args...);std::string str(buf.get(), buf.get() + size_buf - 1);return String(str);
}

提供std::string与String两种格式化效果。之后使用方式:

cofs << U"ERROR" << str_format(U"函数 [%s] 调用失败:参数个数不匹配,形参 [%d] 个,实参 [%d]个", drFunCall.GetHint().c_str(), it->arguments.size(), drFunCall.arguments.size());

顺便再在网上转下,发现fmt库的评价不错。直接拉下来GitHub - fmtlib/fmt: A modern formatting library加入到源码中,可以使用

不过fmt的使用方式是{},有点新鲜,貌似与C++ 20兼容,那就先用上

fmt::format("[{}.Read] > 解析数据{}", prefixType, hint.utf8().ptr());

直接支持中文。

这个过程中发现一个小问题:std::string没法直接转成String,String类提供了一堆构造函数,但就是没有std::string

	String(const char *p_str);String(const wchar_t *p_str);String(const char32_t *p_str);String(const char *p_str, int p_clip_to_len);String(const wchar_t *p_str, int p_clip_to_len);String(const char32_t *p_str, int p_clip_to_len);String(const StrRange &p_range);

顺手增加String与std::string互相转化的逻辑:

头文件:String(const std::string &str);operator std::string();源文件:
String::String(const std::string &str) {std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;std::wstring formatted_wstring = converter.from_bytes(str);copy_from(formatted_wstring.c_str());
}		String::operator std::string() {std::string utf8;const char32_t * utf32 = ptr();for (char32_t c : utf32) {if (c <= 0x7F) {utf8.push_back(static_cast<char>(c));} else if (c <= 0x7FF) {utf8.push_back(static_cast<char>((c >> 6) | 0xC0));utf8.push_back(static_cast<char>((c & 0x3F) | 0x80));} else if (c <= 0xFFFF) {utf8.push_back(static_cast<char>((c >> 12) | 0xE0));utf8.push_back(static_cast<char>(((c >> 6) & 0x3F) | 0x80));utf8.push_back(static_cast<char>((c & 0x3F) | 0x80));} else if (c <= 0x10FFFF) {utf8.push_back(static_cast<char>((c >> 18) | 0xF0));utf8.push_back(static_cast<char>(((c >> 12) & 0x3F) | 0x80));utf8.push_back(static_cast<char>(((c >> 6) & 0x3F) | 0x80));utf8.push_back(static_cast<char>((c & 0x3F) | 0x80));} else {throw std::invalid_argument("Invalid UTF-32 character.");}}return utf8;
}

这就方便了许多。

比如,要将Variant 转为 std::string,直接一路火花带闪电

Variant v;
...
std::string str = v.operator String().operator std::string();

其实还有更简单的用法,不过在代码提示与自动完成情况下,这样写代码更为舒爽。

http://www.yayakq.cn/news/822057/

相关文章:

  • 如何做淘宝优惠卷网站自助云商城
  • 手机网站做分享到朋友圈做搜索的网站有哪些
  • 建设一个展示商品的网站asp网站后台验证码错误
  • 网站工程师培训手机的网站建设目标是什么意思
  • c语言开发网站后端网站如何更换域名
  • 总部在深圳的互联网公司做网站优化的关键词怎么设置
  • 班级网站建设感想上海建设教育网站
  • 教育培训网站源码开源零代码开发平台
  • 建设房屋出租网站三网合一网站建设报价
  • 深圳建模板网站品牌型网站建设哪家
  • 安丘网站建设制作wordpress 5.0
  • 酒店网站建设中国建设银行网站
  • 英语网站online新桥企业网站建设
  • 东莞企业网站排名惠普网站建设的目标
  • 金华外贸网站建设百度词条优化
  • 乌海市网站建设微盟小程序模板
  • 网站做的漂浮为什么不动遂宁市住房与城乡建设厅网站
  • 网站 目录结构专业的手机价格网站建设
  • 成都网站开发培训机构具权威的小企业网站建设
  • 上海建设银行青浦分行网站wordpress修改邮件地址
  • wordpress换站手机网站域名设置
  • 个人网站备案转企业备案西安网页设计
  • 呼市賽罕区信息网站做一顿饭工作外贸商城网站建设公司
  • 昆明网站设计公司互动力 网站建设
  • 建德营销型网站建设wordpress移动主题now
  • 北京网站设计多少钱o2o系统软件
  • 手机登录不了建设银行网站代理平台盈利模式
  • 建网站淄博wordpress重新发布
  • 手机网站页面计生网站生育文明建设
  • 网站布局设计软件wordpress下载数据库文件