请考虑以下标准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)
如果这是常规虚拟继承,我可以将虚拟f和g方法标记为纯粹
struct Base {
virtual void f() = 0;
virtual void g() = 0;
};
Run Code Online (Sandbox Code Playgroud)
并获得关于Foo抽象的编译时错误.但是CRTP没有提供这样的保护.我可以以某种方式实现它吗?运行时检查也是可以接受的.我想过将this->f指针与比较static_cast<Derived …
我的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) 在我们使用 GitLab 的开发中,当功能分支合并到主分支中时,我们通常会压缩它们的提交(如果重要的话,我们使用变基策略而不是合并)。
但是,如果来自功能分支的提交被压缩为单个提交(稍后合并到主分支中)并且分支本身被删除,GitLab 如何仍然显示原始提交?它们是永远保留在存储库中还是最终被删除只是时间问题?
我相信 GitLab 在存储库上做了一些垃圾收集,但我想知道为什么它不影响 MR 的提交。
我有一个包含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,但我找不到合适的东西.
我有一个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)