如何访问模板参数自己的模板参数?
How to access the template argument's own template arguments?
>假设你有一个类模板(例如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;
}
我想到了三种可能性:
- 重写
first
以将n
存储为数据成员,或者 - 重新设计
second
以从first
的实例化类继承,以及 - 在两个类模板中请求完全相同的模板参数。
我问是因为我宁愿不编辑预先存在的代码(选项 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.
};
这将用一个模板参数匹配所有实例。
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 没有为自己的结构调用列表推回方法
- 当从函数参数中的临时值调用复制构造函数时
- 如何创建长度由常量参数指定的数组
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何访问模板参数自己的模板参数?
- 在类自己的成员函数中构造类时,如何强制类模板参数推导?
- 如何使用自己的参数扩展 PointNormal 类?
- 在函数调用时C++多组参数及其自己的括号?
- 当超出列时,clang格式强制每个参数/参数拥有自己的行?
- GCC 或 Clang 关于函数参数在其自己的默认参数中的范围内的名称是否正确?
- C 超载相等运算符.我应该写自己的功能以接受通过参考或值传递的参数
- count_if使用我自己的类实现第三个参数
- 我想根据自己的参数使用count_if
- 知道自己的模板参数模板的模板
- 朋友拥有自己的类模板和其他模板参数
- 如果函数类型仅依赖于其自己的模板参数,则取决于函数类型
- C++ 集<>类对象。使用自己的比较器给出错误:C2804:二进制'operator <'参数过多
- 在自己的默认值中使用参数的名称 - 合法吗?
- 类对象作为参数传递,访问它们自己的私有成员