如何访问模板参数自己的模板参数?

How to access the template argument's own template arguments?

本文关键字:参数 自己的 何访问 访问      更新时间:2023-10-16

>假设你有一个类模板(例如second下文(。假设类模板的模板参数是另一个类模板的实例化(例如first下文(。如何访问模板参数自己的模板参数?这可能吗?

下面是一些代码:

template<size_t n>
class first {
};
template<typename instantiated_first>
class second {
// would like to be able to access the "n"
// of instantiated_first
};
int main() {
second<first<3>> thing;
return 0;
}

我想到了三种可能性:

  1. 重写first以将n存储为数据成员,或者
  2. 重新设计second以从first的实例化类继承,以及
  3. 在两个类模板中请求完全相同的模板参数。

我问是因为我宁愿不编辑预先存在的代码(选项 1(,而且在我的特定应用程序中,将second视为一种first(选项 2(并没有真正的意义(至少对我来说(。我将实例化许多specialized_first类型的对象,因此second"拥有"这些对象并将它们存储在容器中更有意义。选项 3 似乎也不是很时尚。

是否有任何我不知道的花哨模板功能可以很好地完成此操作?

更明智的方法是不要将n存储为数据成员,而是存储为static constexpr size_t,这样它就不会分配任何额外的运行时空间。这是标准和最灵活的机制 - 允许各种其他模板访问此参数而不会大惊小怪。例如,您可以制作一个完全不同的first版本,并允许您的second一直使用其他版本,同时支持原始版本,只要所有版本都满足概念界面。

同样,每个typename T_模板参数都可以通过using T = T_;转发给模板的用户。通常,模板参数是不可访问的,除非您通过将模板参数声明为类型或将其值存储为constexpr或其他方式来允许它们。

您可以重新建模second使其接受相同的模板参数,但是使用first和此值/类型的其他模板越多,或者当您突然想将second用于first的替代版本时,它就越困难。更好地从根本上解决此类问题。例如,在std中,它们的所有模板类都以类似的方式在类中声明了所有必要的类型。

你声明了部分专业化并从那里选择参数。

template<typename T>
class second<first<T>> {
// T is available here for use.
};

或者更普遍地这样做

template<typename T, typename U
class second<U<T>> {
// T is available here for use.
};

这将用一个模板参数匹配所有实例。