Skip to content

败犬日报 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 得到了解决。