这个模板有什么作用?

what does this template do?

在 llvm 源代码中 llvm/IR/PassManager.h 有这个模板(为简洁起见删除了注释):

struct alignas(8) AnalysisKey {};
struct alignas(8) AnalysisSetKey {};
template <typename IRUnitT> class AllAnalysesOn {
public:
  static AnalysisSetKey *ID() { return &SetKey; }

private:
  static AnalysisSetKey SetKey;
};

template <typename IRUnitT> AnalysisSetKey AllAnalysesOn<IRUnitT>::SetKey;

编辑: 我只是对此感到困惑:template <typename IRUnitT> AnalysisSetKey AllAnalysesOn<IRUnitT>::SetKey;

我熟悉为 class 或函数使用模板。上面的用法显得很不一样。模板定义后跟的不是 class 或函数,而是后跟结构,然后是 class 成员变量。任何对它的作用或为什么这样写的见解都将不胜感激。

假设它不是模板并且我们不关心对齐方式,那么它看起来像这样:

struct AnalysisKey {};
struct AnalysisSetKey {};

class AllAnalysesOn {
public:
  static AnalysisSetKey *ID() { return &SetKey; }    
private:
  static AnalysisSetKey SetKey;
};

AnalysisSetKey AllAnalysesOn::SetKey;

最后一行是静态成员的定义SetKey.

SetKey 是一个静态数据成员所以在这一行

template <typename IRUnitT> AnalysisSetKey AllAnalysesOn<IRUnitT>::SetKey;

您正在提供该变量的定义,以便在使用此模板时可以将内存分配给静态变量。

如果你使用的是 C++17,这一行可以写成:

static inline AnalysisSetKey SetKey;

那么你确实需要写下你越来越难以理解的行。