关于C++中的typedef typename的含义

关于C++中的typedef typename的含义

用于告诉编译器,我要使用的使类型。

假设

C++ 复制代码
template <typename CONFIG>
class Table {
  typedef typename CONFIG::Value VALUE;

public:
  void insert(VALUE v);
};

如果有一个结构体声明如下

C++ 复制代码
struct IntConfig {
  typedef int Value;
};

那么声明一个Table变量如下

C++ 复制代码
Table<IntConfig> t;

编译器在展开后会得到如下

C++ 复制代码
typedef int VALUE;

现在C++标准更倾向于使用

C++ 复制代码
using VALUE = typename CONFIG::Value;

JVM hotspot中,很多表的实现采用了上述的方式,以符号表为例说明

C++ 复制代码
template <typename CONFIG, MEMFLAGS F>
class ConcurrentHashTable : public CHeapObj<F> {
  typedef typename CONFIG::Value VALUE;
 private:
  // This is the internal node structure.
  // Only constructed with placement new from memory allocated with MEMFLAGS of
  // the InternalTable or user-defined memory.
  class Node {
   private:
    Node * volatile _next;
    VALUE _value;

很明显,这里使用了模板类,然后在VALUE _value需要替换为CONFIG::Value

这里的typedef typename告诉编译器我要使用的使CONFIG类的Value类型

假设

C++ 复制代码
typedef ConcurrentHashTable<SymbolTableConfig, mtSymbol> SymbolTableHash;

class SymbolTableConfig : public AllStatic {
private:
public:
  typedef Symbol* Value;  // value of the Node in the hashtable

可以看出,在SymbolTableConfig中定义了Value类型为Symbol*

于是对于ConcurrentHashTable中的Node类中的VALUE值就是Symbol*

相关推荐
万法若空8 小时前
C++ <memory> 库全方位详解
开发语言·c++
代码中介商8 小时前
C++ 类型转换深度解析:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
青小莫8 小时前
C++之string(OJ练习)
开发语言·c++·stl
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
-Marks-8 小时前
【C++编程】STL简介 --- (是什么 | 版本发展历程 | 六大组件 | 重要性缺陷以及如何学习)
开发语言·c++·学习·stl·stl版本
CoderCodingNo9 小时前
【信奥业余科普】C++ 的奇妙之旅 | 12:程序的交互与加工——数据的输入与算术运算
开发语言·c++
yx868xy9 小时前
Cuda加速直线拟合
c++·cuda
蜗牛在听雨10 小时前
基于 C++ 的 UG/NX 二次开发环境配置
c++·二次开发·ug
SimpleLearingAI10 小时前
C++虚函数详解
开发语言·c++