这个模板有什么作用?
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;
那么你确实需要写下你越来越难以理解的行。
在 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;
那么你确实需要写下你越来越难以理解的行。