C++ - 获取一个类用作另一个模板时的模板类型名称

3

我希望从一个使用基于第一个类的模板的另一个类中获取类模板的类型名称。

我已经编写了以下类:

template<typename T>
class class_a {
  ...
}

我希望做一些事情:

template<class class_a>
class class_b {
  std::vector<class_a.T> arr;
  ...
}

你不能直接这样做。这就是为什么标准容器有成员类型,比如 std::vector::value_type - Cássio Renan
1个回答

6

最简单的方法是使您的模板相互“协作”,并且class_a能够“帮助”其他模板:

template<typename T>
class class_a {

public:
   typename T type_t;
};

然后:

template<class class_a>
class class_b {
  std::vector<typename class_a::type_t> arr;
  ...
};

在C++库本身中,您会发现这是一种相当标准的设计模式。例如,大多数C++容器定义了value_type,因此如果我们将typedef更改为value_type

template<typename T>
class class_a {

public:
   typename T value_type;
};

接下来:

template<class class_a>
class class_b {
  std::vector<typename class_a::value_type> arr;
  ...
};

如果你使用std::list来实例化你的class_b,例如:

class_b<std::list<char>> b;

那么你的arr最终会变成std::vector<char>

另一种不需要这种"协作"的替代方法是使用一个具有特化的辅助模板,以避免显式声明typedef别名。但是,除非你有某些特定的原因不采用这种方式,否则这是最简单的解决方案。


1
是的。但是与其使用旧式的 typename T type_t;,不如采用现代的类型别名形式 using type_t = T; - Martin York
无论我使用 type_t 还是 value_type,都会出现这个错误:error: expected nested-name-specifier before ‘T’ - th3g3ntl3man
当然,我不知道您是如何“使用 type_tvalue_type”,也不知道哪一行代码导致了错误。这是非常基础的内容,在您的C++教材中应该有很多类似的示例供您模仿。 - Sam Varshavchik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接