【问题标题】:Using a class template that is the member of a class使用作为类成员的类模板
【发布时间】:2018-02-22 16:08:20
【问题描述】:

您可以从命名空间中获得类模板的“简写”,只需给出模板的名称即可。但是,如果类模板在一个类中,我必须创建一个别名模板并写出所有模板参数和参数——这不利于可维护性:

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

我能否以更简单的方式为此类模板提供“速记”?

【问题讨论】:

    标签: c++ templates namespaces


    【解决方案1】:

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

    【讨论】:

    • 所以我必须在将我的模板隐藏在一个类中(作为私有成员)或将它们放在一个命名空间中(通过使它们有资格在 using声明)?
    【解决方案2】:

    如果MyOuterClass::MyInnerClass&lt;&gt;只有type模板参数,您可以使用以下可变别名模板

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

    但是,您仍然需要提供参数包 TArgs


    假设 C++17,如果 MyOuterClass::MyInnerClass&lt;&gt; onlynon-type 模板参数,您可以使用以下可变参数别名模板:

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

    【讨论】:

    • 仅当所有模板参数都是类型模板参数时才有效。请参阅我的编辑以获取反例。
    • 在 c++17 中可能是 auto...? (不确定这是否真的有效)
    • 我认为 C++17 的 auto 仅适用于非类型模板参数。
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多