小编ura*_*nix的帖子

保护CRTP模式免于"纯虚拟"调用中的堆栈溢出

请考虑以下标准CRTP示例:

#include <iostream>

template<class Derived>
struct Base {
    void f() { static_cast<Derived *>(this)->f(); }
    void g() { static_cast<Derived *>(this)->g(); }
};

struct Foo : public Base<Foo> {
    void f() { std::cout << 42 << std::endl; }
};

int main() {
    Foo foo;
    foo.f(); // just OK
    foo.g(); // this will stack overflow and segfault
}
Run Code Online (Sandbox Code Playgroud)

如果这是常规虚拟继承,我可以将虚拟fg方法标记为纯粹

struct Base {
    virtual void f() = 0;
    virtual void g() = 0;
};
Run Code Online (Sandbox Code Playgroud)

并获得关于Foo抽象的编译时错误.但是CRTP没有提供这样的保护.我可以以某种方式实现它吗?运行时检查也是可以接受的.我想过将this->f指针与比较static_cast<Derived …

c++ virtual-functions crtp pure-virtual

21
推荐指数
3
解决办法
1309
查看次数

强制CMake在每次构建时生成configure_file目标

我的CMakeLists.txt文件中有以下命令

configure_file([...]/Version.h.in [...]/Version.h @ONLY)
Run Code Online (Sandbox Code Playgroud)

如何在每次构建时运行它,但不仅仅是在Version.h.in更改时?我需要它,因为它中Version.h__DATE__宏,实际上应该被视为每个构建的新内容,即使它保持不变.

Version.h.in模样

static const char VERSION[] = "Bla-bla-bla " @FOOBAR@ " built on " __DATE__;
Run Code Online (Sandbox Code Playgroud)

c++ cmake

6
推荐指数
1
解决办法
4860
查看次数

即使在 MR 合并后删除分支后,GitLab 是否仍保留提交

在我们使用 GitLab 的开发中,当功能分支合并到主分支中时,我们通常会压缩它们的提交(如果重要的话,我们使用变基策略而不是合并)。

但是,如果来自功能分支的提交被压缩为单个提交(稍后合并到主分支中)并且分支本身被删除,GitLab 如何仍然显示原始提交?它们是永远保留在存储库中还是最终被删除只是时间问题?

我相信 GitLab 在存储库上做了一些垃圾收集,但我想知道为什么它不影响 MR 的提交。

squash gitlab merge-request

6
推荐指数
1
解决办法
622
查看次数

根据模板参数生成不同大小的初始化列表

我有一个包含T没有默认构造函数的对象数组的类.这是一个例子:

#include <iostream>

struct Param {
    int x;
};

struct A {
    A(const Param &p) {
        std::cout << p.x << std::endl;
    }
};

template<class T, int n>
struct Array {
    T data[n];
                                 /*     n times     */
    Array(const Param &p) : data{/* T(p), ..., T(p) */} { }
};

int main() {
    Param p{42};
    Array<A, 3> arr(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来初始化data字段使用不同大小的初始化列表T(p)包含精确n元素的元素.我觉得它可以通过一些结构来实现std::make_index_sequence,但我找不到合适的东西.

c++ templates initializer-list variadic-templates c++14

4
推荐指数
1
解决办法
447
查看次数

std :: map []和size()的map顺序

我有一个std::map并试图填充它(name, id).该id字段只是从地图生成size().这是一个简化版本:

#include <iostream>
#include <map>

struct A {
    std::string name;
    int id;
    A(const std::string &s) : name(s), id(-1) { }
};

class Database {
    std::map<std::string, int> ids;
public:
    void insert(A *item) {
        ids[item->name] = item->id = ids.size();
    }
    void dump() const {
        for (std::map<std::string, int>::const_iterator i = ids.begin(); i != ids.end(); i++)
            std::cout << i->second << ". " << i->first << std::endl;
    }
};

int main(int argc, char **agrv) {
    A …
Run Code Online (Sandbox Code Playgroud)

c++ stl map

3
推荐指数
1
解决办法
120
查看次数