关于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*

相关推荐
GG-_-Bond6 小时前
9.1 kv存储resp协议模拟面试
c++
米糕闯编程7 小时前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
xiangyun618 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun618 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
fpcc10 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__10 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Escalating_xu10 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
bnmoel10 小时前
C++ 基础入门篇(三):内联函数与空指针
c++·内联函数·nullptr·低层
码匠许师傅10 小时前
【C++三方组件】TinyXML2:两个文件的极简 XML 解析器
xml·c++
free-elcmacom11 小时前
C++学习<1>程序分区
开发语言·c++