你可以使用"简写"通过仅给出模板的名称来从命名空间中获取类模板。但是,如果类模板在一个类中,我必须创建一个别名模板并写出所有模板参数和参数 - 这对于可维护性是不利的:
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(){}
我可以使用&#34;简写&#34;以更简单的方式获得这样的模板?
答案 0 :(得分:1)
如果MyOuterClass::MyInnerClass<>
仅 类型 模板参数,您可以使用以下可变别名模板:
template<typename... TArgs>
using MyInnerClass = MyOuterClass::MyInnerClass<TArgs...>;
但是,您仍需提供参数包 TArgs
。
假设C ++ 17,如果MyOuterClass::MyInnerClass<>
只有 非类型 模板参数您可以使用以下可变参数别名模板:
template<auto... Val>
using MyInnerClass = MyOuterClass::MyInnerClass<Val...>;
答案 1 :(得分:1)
没有。没有这种方式。对于使用的using
语句(没有双关语)使定义可见实际上是同一关键字的不同版本。一个是using declaration
,另一个是typedef
的别名。它们以不同的方式工作,并提供不同的(虽然有时候看起来相似)结果。