我正在使用C++对大型遗留代码库进行国际化,我面临一个困难的决定:我应该使用boost :: locale或std c ++ locales吗?
我承诺使用utf-8.我们必须进行相当广泛的文本处理,尽管它不是我们的代码所做的核心,但它很重要.我们可以期望完成大部分可能需要做的事情:时间,日期,数字和金钱格式化,整理,正则表达式,子串隔离,与boost :: filesystem的交互,数据库访问等.
boost :: locale的介绍我明白了
我无法评估第1点的影响我认为第2点非常严重,如果它影响我们,广告3和4对我们来说不是什么大问题.
在社区中是否有共识认为Boost :: locale是更好的选择?标准社区中是否有任何动议来解决std :: locale的问题?任何人都可以帮我做出更明智的决定吗?
也许最重要的是,从一个迁移到另一个是否很简单?这两个人互相打得怎么样?使用boost语言环境设置全局语言环境,然后使用std工具是否合法?
我想创建一个工具,在克隆所述存储库之前检查我是否已经拥有远程存储库的本地克隆.要做到这一点,我需要一种方法来测试B是否与存储库A相同 - 我猜我的意思是他们有可合并的历史记录.B的名称可能与A不同,可能还有其他分支 - 通常的用例.
有没有办法做到这一点?我有一个初步的想法如何做到这一点,但我想也许这里有人有一个明确的答案.
获取分支列表并搜索公共分支(通过哈希).然后对于公共分支,检查初始提交是否相同(通过哈希).那时我会说'够好'.我想我没事,除非有人一直在搞乱历史,这是我愿意忽视的用例.要做到这一点,我需要一种方法来获取分支并从远程存储库提交信息,而无需进行克隆.我可以使用ssh和bash来解决这个问题,但是仅使用git的解决方案会更好.
对这个半生不熟的想法的反馈也很受欢迎.
引用的问题是寻找唯一的存储库ID,或者创建一个存储库ID.没有这样的野兽存在,即使它确实存在,它是否与此相关仍然值得怀疑,因为我想确定两个存储库是否具有可合并的历史(即我可以在两者之间获取和合并) - 一个稍微更好定义的问题.我愿意忽略用户修改历史记录的可能性,但也很想听听如何处理这种情况.
考虑一个由一个库和一组使用该库的可执行文件组成的项目。一种简单的方法是add_library()
,后接一系列对add_executable()
target_link_libraries()
。
这是大量的样板代码。如果能够执行类似的操作set(PROJECT_LINK_LIBS, lib1 ...)
并让 CMake 删除额外的样板文件,那就太好了。
进一步思考这一点,我意识到我想要一个link_libraries
行为类似于 的函数include_directories
。我认为:
有这样的事吗?
我正在将旧代码库从使用字符串的自定义实现迁移到使用 std::string。我们的一位工程师担心这可能会导致我们使用 += 和 + 连接相对较长的字符串时出现性能问题。他特别关心的是随着字符串的动态增长如何分配内存,他建议 stringstream 在这方面表现得更好。对于那些试图回应“基准然后优化”或对这些效果的看法的人 - 我当然同意,这就是计划。我只是想知道这个理论。
我对这个问题做了一些搜索,并遇到了这个问题: Efficient string concatenation in C++,这有点过时了。
现在我想知道:字符串 += 的内存分配算法真的与字符串流的不同吗?上面问题中提出的复制问题怎么样——这些问题在 C++ 11/14 中发生了变化吗?
从手册:
在GCC 5.1版本中,libstdc ++引入了一个新的库ABI,其中包括std :: string和std :: list的新实现.这些更改对于符合2011 C++标准是必要的,该标准禁止写入时写入字符串并要求列表跟踪其大小.
可以使用_GLIBCXX_USE_CXX11_ABI宏来控制库标头使用旧的或新的ABI,而不管使用哪个"-std".
我想知道使用这种"兼容性ABI"的含义是什么?我猜小串操作的运行时性能会受到影响(我假设是负面的),并且列表大小访问从O(1)(C11 ABI)到O(N)(兼容性ABI).
我有一个表盘,它是时间序列聚合。我对除 Grafana 或 Graphite 提供的“公制”和“当前”标签之外的所有内容都很满意。
我可以覆盖这些标签吗?
考虑一个包含以十六进制表示法表示的整数序列的文件.我可以像这样流式传输它们:
using namespace std;
ifstream infile(fname);
unsigned int i;
vector<unsigned int> vals;
while (infile >> std::hex >> i){
vals.push_back(i);
}
Run Code Online (Sandbox Code Playgroud)
如果我想用同样的东西做什么怎么办istream_iterator
?
/// borks on hex:
copy(istream_iterator<unsigned int>(infile),
istream_iterator<unsigned int>(), back_inserter(ref_data));
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉istream_iterator
如何采用十六进制表示法?
我们设置了一些共享工作空间的工作。各个分支的工作流程是:
foo
.foo
.我们通过将Use custom workspace
下游作业的字段分配给构建工作区来实现这一点。
最近,我们选择了一个分支,并将其分配给 Jenkins 从机而不是主机上构建。我惊讶地发现,在主服务器上,foo
存储库被克隆到$JENKINS_JOBS_PATH/FOO/workspace/foo_repo
- 而在从服务器上,存储库被克隆到$JENKINS_JOBS_PATH/FOO/foo_repo
.
这是设计使然,还是我们以某种方式配置了主从不一致?
我最近遇到了一种情况,我想将int64_t
值的原始字节放入字符串流中。在 C++17 中,我可以执行以下操作:
uint64_t val = 1984;
std::stringstream sstr;
sstr << "the byte value is " << std::string_view(reinterpret_cast<char*>(&val), sizeof(decltype(val)));
Run Code Online (Sandbox Code Playgroud)
而鲍勃是你的叔叔。但我需要用 C++98 或者 C++11 来做。我想这样做:
std::copy(reinterpret_cast<const char*>(&tmp_time),
reinterpret_cast<const char*>(&tmp_time) + sizeof tmp_time,
std::back_inserter(sstr));
Run Code Online (Sandbox Code Playgroud)
但是 g++ 在实例化 a 时抱怨back_inserter
没有value_type
在 a 中命名的类型basic_stringstream
。
我可以不std::copy
进入一个stringstream
对象吗?我该怎么做?请注意,上面是一个简单的例子,我不愿意放弃流语义,因为它们在实际上下文中非常整洁。
由于最好的原因未提及,我想将所有警告视为错误,除了一个警告(已弃用),我想作为警告.
有没有更方便的方法来列出我想要手工处理的所有警告?