我知道标题很奇怪,所以这里是解释:
我有一些代码,我宁愿不修改,但我需要重新定义一些函数.最小的例子是这样的:
int main()
{
strcpy_s(a,b);
}
Run Code Online (Sandbox Code Playgroud)
但当我运行这个:
$ g++ -E -P -w -D"strcpy_s(D,S) strcpy(D,S) buahaha" test.cpp
Run Code Online (Sandbox Code Playgroud)
我明白了:
int main()
{
strcpy(a,b) buahaha 1;
}
Run Code Online (Sandbox Code Playgroud)
这是什么1?忽略buahaha,这只是为了表明PP有所作为.
前一阵子我偶然发现了以下一行代码:
return accumulate(s, s + size, char(), (_1 ^ _2));
Run Code Online (Sandbox Code Playgroud)
它使用的是boost标题,但我一直认为它非常非常优雅(注意lambda没有命名输入参数,所以它超短.:)请注意我知道C++ 11有lambda函数,这是不是关于lambdas,而是关于这个很好的短语法.
这是出于调试目的.
为了测试代码的短发送/短接收处理部分是否正常工作......
有没有办法强制Windows生成短发送/ rcvs,即使是从/向socket读取/写入的少量字节?
我更喜欢每个进程执行此操作,但如果每个进程都无法完成此操作,我就可以测试Firefox/Outlook代码如何处理这个问题了.:)
我知道我可以手动添加巨大的消息来强迫这个,但我正在处理具有多层内容的巨大旧代码库,所以即使添加一个充满随机字节的简单巨大的消息也是非常重要的.:)
我在运行 git pre-commit hook 时得到了奇怪的结果,例如,当我在终端中执行 git diff --name-only 时,它似乎给出了与在 .git/hooks/pre-commit 中执行时不同的结果
所以我的问题是:
我问这个是因为我尝试了 2 或 3 次:我修改文件,我手动运行脚本,它打印出来
#! /bin/sh -xv
files=$(git diff --name-only)
+ git diff --name-only
+ files=path/to/file.h
echo $files
+ echo path/to/file.h
path/to/file.h
...
Run Code Online (Sandbox Code Playgroud)
当我执行 git commit -am"eh" 时,输出会有所不同
#! /bin/sh -xv
files=$(git diff --name-only)
+ git diff --name-only
+ files=
echo $files
+ echo
Run Code Online (Sandbox Code Playgroud) 我有以下代码,它可以工作,但是 C++20 版本看起来并不比 C++17 版本好多少。我的猜测问题是multimap equal_range返回 apair并且范围无法确定这是一对有效的迭代器。
有没有办法用更短更好的方式来写这个?
#include <iostream>
#include <map>
#include <ranges>
int main() {
std::multimap<bool,int> oddness{{false,2}, {true,3}, {true,47}, {false,74656}};
// nice, does not work:
// oddness.equal_range(true) | std::views::values;
// works:
oddness | std::views::values;
// working code:
auto odds = oddness.equal_range(true);
const auto odds_view = std::views::values(std::ranges::subrange(odds.first, odds.second));
for (const auto& odd : odds_view) {
std::cout << odd << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud) 动机:有时我使用 std::variant 来实现“花式”枚举,其中一些枚举状态可以携带状态。
现在,如果我想将<=>用于我的变体,它需要我的空结构已经定义 <=>。这对我来说似乎有点奇怪,因为如果类型具有 0 位状态,则该类型的所有实例都是相同的。
完整示例:
#include <compare>
#include <iostream>
#include <variant>
struct Off{
// without this the code does not compile
auto operator<=>(const Off& other) const = default;
};
struct Running{
int rpm=1000;
auto operator<=>(const Running& other) const = default;
};
using EngineState = std::variant<Off, Running>;
int main()
{
EngineState es1, es2;
es1<=>es2;
}
Run Code Online (Sandbox Code Playgroud) AFAIKunique_ptr与 PIMPL 一起使用非常棘手,因为删除器是unique_ptr类型的一部分,因此它不适用于不完整的类型。另一方面,shared_ptr使用动态删除器,因此它可以处理不完整的类型。
shared_ptr无论我是否需要,都存在给我原子操作的性能问题。
我可以使用其他更快的替代方案吗std::?我显然对类型擦除很满意,我说的是原子引用计数的成本。
#include <any>
#include <memory>
#include <iosfwd>
std::shared_ptr<std::fstream> sp;
// unique_ptr requires complete type
// std::unique_ptr<std::fstream> up;
std::any a;
#include <fstream>
int main() {
// any requires copy_constructible
// a = std::fstream{};
sp = std::make_shared<std::fstream>();
}
Run Code Online (Sandbox Code Playgroud)
笔记:
any,但它不适用于某些类型。unique_ptr函数永远不会“告诉”删除器构造的对象是什么(为删除器提供一种学习如何销毁对象的方法)。PS 我知道很久以前boost::shared_ptr就有宏来禁用原子引用计数,但即使仍然支持我也不想切换到boost::shared_ptr.
c++ ×6
c++20 ×3
boost ×1
c ×1
c++11 ×1
g++ ×1
git ×1
lambda ×1
pimpl-idiom ×1
shared-ptr ×1
sockets ×1
std-ranges ×1
winapi ×1
winsockets ×1