模板基 class 函数成员的别名
Alias for template base class function members
我正在编写使用大量模板的代码,而且我经常偶然发现如下所示的代码:
template<class T, class V>
struct Base { Base(int a) {} };
template<class T, class V>
struct Derived : public Base<T,V>
{
using Base<T,V>::Base; // [1] ok it works
using Base::Base; // [2] Does not work
};
想想当你写的不是T个更有意义的名字时,[1]语句就变得太长了..难道没有办法使用像[2]这样的语句吗?或者在即将发布的 C++ 标准中有什么可以简化这一点的吗?
您可以定义类型别名:
template<class T, class V>
struct Derived : public Base<T,V>
{
using BaseClass = Base<T,V>;
using BaseClass::Base;
};
using
关键字在C++中有三种含义。可以介绍:
- a using-directive,
- a using-声明,
- 或类型别名。
A using-directive 具有 using namespace please_not_std
的形式,并将 please_not_std
命名空间中的任何内容带到当前范围(这是一种简化)。
A using-declaration 具有 using Class::name
形式,并将在别处定义的名称引入当前范围。
A type alias (C++11) 具有 using new_type = existing_type
的形式并定义了...类型别名。
仅使用 Base::Base
的问题是名称 Base
(在左侧)应该是父 class 的注入名称 Base<T, V>
,但由于该父项是依赖项,因此不会搜索名称,因此找不到注入的 class 名称。
您可以通过在依赖上下文中使用注入的 class 名称来解决这个问题,这样它的查找就会推迟到实例化时进行。像这样:
template<class T, class V>
struct Derived : public Base<T,V>
{
using Derived::Base::Base;
};
Derived
是正常找到的(就是这个实例化注入的class名字),已知是依赖的,所以中间的Base
是已知依赖的,会仅在实例化时查找 Derived
,此时所有碱基都是完全已知的并且可以搜索。
通常,您可以将注入的class 名称用于此类目的。这里的问题是这个注入的 class 名称是模板化基础 class 的成员,因此它是正式依赖的,因此需要获取第一个 Base
在 using Base::Base
.
但我们可以在这里操纵查找的工作方式:
template<class T, class V>
struct Derived : public Base<T,V>
{
using Derived::Base::Base;
};
Derived
是 Derived<T,V>
的注入 class 名称。这样就找到了,现在我们正在对 Base
进行限定查找,因此依赖不再是问题。
我正在编写使用大量模板的代码,而且我经常偶然发现如下所示的代码:
template<class T, class V>
struct Base { Base(int a) {} };
template<class T, class V>
struct Derived : public Base<T,V>
{
using Base<T,V>::Base; // [1] ok it works
using Base::Base; // [2] Does not work
};
想想当你写的不是T个更有意义的名字时,[1]语句就变得太长了..难道没有办法使用像[2]这样的语句吗?或者在即将发布的 C++ 标准中有什么可以简化这一点的吗?
您可以定义类型别名:
template<class T, class V>
struct Derived : public Base<T,V>
{
using BaseClass = Base<T,V>;
using BaseClass::Base;
};
using
关键字在C++中有三种含义。可以介绍:
- a using-directive,
- a using-声明,
- 或类型别名。
A using-directive 具有 using namespace please_not_std
的形式,并将 please_not_std
命名空间中的任何内容带到当前范围(这是一种简化)。
A using-declaration 具有 using Class::name
形式,并将在别处定义的名称引入当前范围。
A type alias (C++11) 具有 using new_type = existing_type
的形式并定义了...类型别名。
仅使用 Base::Base
的问题是名称 Base
(在左侧)应该是父 class 的注入名称 Base<T, V>
,但由于该父项是依赖项,因此不会搜索名称,因此找不到注入的 class 名称。
您可以通过在依赖上下文中使用注入的 class 名称来解决这个问题,这样它的查找就会推迟到实例化时进行。像这样:
template<class T, class V>
struct Derived : public Base<T,V>
{
using Derived::Base::Base;
};
Derived
是正常找到的(就是这个实例化注入的class名字),已知是依赖的,所以中间的Base
是已知依赖的,会仅在实例化时查找 Derived
,此时所有碱基都是完全已知的并且可以搜索。
通常,您可以将注入的class 名称用于此类目的。这里的问题是这个注入的 class 名称是模板化基础 class 的成员,因此它是正式依赖的,因此需要获取第一个 Base
在 using Base::Base
.
但我们可以在这里操纵查找的工作方式:
template<class T, class V>
struct Derived : public Base<T,V>
{
using Derived::Base::Base;
};
Derived
是 Derived<T,V>
的注入 class 名称。这样就找到了,现在我们正在对 Base
进行限定查找,因此依赖不再是问题。