使用是类成员的类模板

Using a class template that is the member of a class

本文关键字:成员      更新时间:2023-10-16

您只能通过仅赋予模板名称来从名称空间中使用类模板的"速记"。但是,如果类模板在类中,我必须创建一个别名模板并写出所有模板参数和参数 - 对可维护性不利:

namespace mynamespace {
    template<template<class> class T>
    class MyClass;
}
using mynamespace::MyClass; // OK, straight and simple
class MyOuterClass {
public:
    template<template<class> class T>
    class MyInnerClass;
};
// using MyInnerClass = MyOuterClass::MyInnerClass; // error: invalid use of template-name 'MyOuterClass::MyInnerClass' without an argument list
// template<typename... TArgs> // error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class T> class MyOuterClass::MyInnerClass'
// using MyInnerClass = MyOuterClass::MyInnerClass<TArgs...>;
template<template<class> class T> // OK, but copying the template parameter list is bad, there should be some "auto" mechanism...
using MyInnerClass = MyOuterClass::MyInnerClass<T>;
int main(){}

运行代码

我可以以更简单的方式为这样的模板提供"速记"吗?

no。没有这种方式。对于使用(无需双关语(使定义可见的using语句实际上是同一关键字的不同版本。一个是using declaration,另一个是typedef的别名。它们的工作方式有所不同,并提供了不同的结果(尽管有时看起来相似(。

如果 MyOuterClass::MyInnerClass<> have type 模板参数,您可以使用以下 variadic variadic别名模板

template<typename... TArgs>
using MyInnerClass = MyOuterClass::MyInnerClass<TArgs...>;

但是,您仍然必须提供参数pack TArgs


假设C 17,如果MyOuterClass::MyInnerClass<> non-Type 模板参数您可以使用以下variadic别名模板:

template<auto... Val>
using MyInnerClass = MyOuterClass::MyInnerClass<Val...>;