如何使用类型别名从模板化类中隐藏模板列表

How to hide a template list from templated class using type alias

本文关键字:隐藏 列表 何使用 别名 类型      更新时间:2023-10-16

(这是针对C++11(

我正在尝试使用类型别名隐藏模板化类的模板列表,以便使代码更具可读性。但它不起作用,我什至不确定这是否可能。

我的代码看起来像这样:

template<
class A,
class B,
...
class Z>
class Class1
{
A objA;
B objB;
...
Z objZ;
};

// Define an alias for Class1 to hide all its template parameters
// in a way that is re-usable from other classes
typedef typename Class1<class A, class B, ..., class Z> Type_Class1

template<
class A,
class B,
...
class Z>
class Class2
{
// Create an obj of Class1, 
Type_Class1 class1Obj;
...
}
...
template<
class A,
class B,
...
class Z>
class ClassN
{
// Create an obj of Class1
Type_Class1 class1Obj;
...
}

我的意图是:

  1. 每次创建 Class1 obj 时保存指定所有模板参数的行
  2. 避免在要创建 Class1 obj 的每个类中指定别名类型

有什么想法吗?

提前谢谢。

你试图做的事情不起作用。

如果我理解正确,您希望类定义中的Type_Class1Type_Class1<A, ..., Z>相同,这意味着模板参数与类模板参数的类型相同。

这只能在类本身的侧面实现:

template<
class A,
class B,
...
class Z>
class Class2
{
using Type_Class1 = Class1<A, ..., Z>;
// Create an obj of Class1, 
Type_Class1 class1Obj;
...
};

您不能在类外部执行此操作,因为这超出了要使类型依赖的参数的范围。


你写的东西有完全不同的行为。在模板参数列表中(而不是在模板定义的参数列表中(中使用class关键字时,具有完全不同的含义和您可能不希望的异常行为。

它是一个所谓的详细类型说明符,具有在封闭命名空间作用域中声明给定名称的新类的效果(如果还没有可以通过名称查找找到的该名称的类类型(。

您的Type_Class1将使用与这些类相等的模板参数进行Class1,而不是使用Type_Class1的类的模板参数

怎么样

using Type_Class1 = Class1<A, B, ..., Z>;

请注意,对于usingtypedef,您将执行Class1<A,...>而不是Class<class A,...>