使用作为类成员的类模板

时间:2018-02-22 16:08:20

标签: c++ templates namespaces

你可以使用"简写"通过仅给出模板的名称来从命名空间中获取类模板。但是,如果类模板在一个类中,我必须创建一个别名模板并写出所有模板参数和参数 - 这对于可维护性是不利的:

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(){}

Run code

我可以使用&#34;简写&#34;以更简单的方式获得这样的模板?

2 个答案:

答案 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的别名。它们以不同的方式工作,并提供不同的(虽然有时候看起来相似)结果。