Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用作为类成员的类模板_C++_Templates_Namespaces - Fatal编程技术网

C++ 使用作为类成员的类模板

C++ 使用作为类成员的类模板,c++,templates,namespaces,C++,Templates,Namespaces,只需给出模板的名称,就可以从命名空间中对类模板进行“速记”。但是,如果类模板位于类中,我必须创建别名模板并写出所有模板参数和参数-这对可维护性不利: namespace mynamespace { template<template<class> class T> class MyClass; } using mynamespace::MyClass; // OK, straight and simple class MyOuterClass { pu

只需给出模板的名称,就可以从命名空间中对类模板进行“速记”。但是,如果类模板位于类中,我必须创建别名模板并写出所有模板参数和参数-这对可维护性不利:

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(){}
名称空间mynamespace{
模板
类MyClass;
}
使用mynamespace::MyClass;//好的,简单明了
类子宫类{
公众:
模板
类MyInnerClass;
};
//使用MyInnerClass=MyOuterClass::MyInnerClass;//错误:在没有参数列表的情况下,模板名称“MyOuterClass::MyInnerClass”的使用无效
//模板//错误:“模板类MyOuterClass::MyInnerClass”的模板参数列表中参数1的类型/值不匹配
//使用MyInnerClass=MyOuterClass::MyInnerClass;
template//OK,但是复制模板参数列表不好,应该有一些“自动”机制。。。
使用MyInnerClass=MyOuterClass::MyInnerClass;
int main(){}


我可以用一种更简单的方式来“速记”这样的模板吗?

如果
MyOuterClass::MyInnerClass
只有具有类型模板参数,您可以使用以下可变别名模板:

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

不,没有这种办法。使用语句使定义可见(没有双关语)实际上是同一关键字的不同版本。一个是使用声明的
,另一个是
类型定义的别名。它们的工作方式不同,并提供不同的结果(尽管有时外观相似)。

仅当所有模板参数都是类型模板参数时才起作用。请参阅我的编辑以获得一个反例。在c++17中可能是
auto…
?(不确定这是否真的有效)我认为C++17的
auto
仅适用于非类型模板参数。因此,我必须在将模板隐藏在类中(作为私有成员)或将其放置在命名空间中(通过使它们有资格在使用声明时使用,从而使它们更易于使用)之间进行权衡?
template<auto... Val>
using MyInnerClass = MyOuterClass::MyInnerClass<Val...>;