模板基 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 的成员,因此它是正式依赖的,因此需要获取第一个 Baseusing Base::Base.

但我们可以在这里操纵查找的工作方式:

template<class T, class V>
struct Derived : public Base<T,V>
{
    using Derived::Base::Base;
};

DerivedDerived<T,V> 的注入 class 名称。这样就找到了,现在我们正在对 Base 进行限定查找,因此依赖不再是问题。