败犬日报 2024-11-30
1. 有没有比 mt19937 更快的伪随机数算法
这里列举了亿些算法:https://www.pcg-random.org/
一个简单的例子就是 LCG(线性同余生成器),但是几乎没有安全性,只有快。
cpp
const long a = 1664525;
const long c = 1013904223;
const long m = 4294967296;
struct LCG {
long seed;
LCG(long s) : seed(s) {}
long next() {
seed = (a * seed + c) % m;
return seed;
}
};
2. 模板类的虚函数不能用 requires 控制 override,如果 requires 失败就调用基类函数
cpp
class B {
public:
virtual void f() const { printf("B\n"); }
};
template <typename T>
class A : public B {
public:
void f() const
requires(std::is_same_v<T, int>)
override {
printf("A\n");
}
};
int main() {
auto a = A<float>(); // 编译错误
}
对于不是虚函数的情况,在名字查找找到派生类的函数名之后会检查函数的 requires,这里 requires 不通过是编译失败的。
如果虚函数的 requires 不通过不是编译失败,而是调用基类的函数,这个跟上面的不是虚函数的情况完全不同,很容易造成误解。
3. 关于 C++ 语法给 Objective-C 让路
https://www.think-cell.com/en/career/devblog/trip-report-fall-iso-cpp-meeting-in-wroclaw-poland
好消息是,P2996 —— C++26 的反射功能正在按计划进行中,预计将在 C++26 标准中引入。最后一个需要解决的大问题是与 Objective-C 块之间的语法歧义(确实如此)。这个问题通过将反射操作符从
^foo
更改为^^foo
得到了解决。