繁体   English   中英

可以使用 C++20 概念来避免从基类中隐藏模板函数吗?

[英]Can C++20 concept be used to avoid hiding template function from base class?

我想使用模板专业化来查询派生对象的组件。

下面的代码工作正常。

但是,我是 C++ 新手。
我不确定这样的编译器行为是否可靠,并且需要一些确认。

#include <type_traits>
class B{
   public: template<class T> T* get() requires std::is_same_v< T, B>{ //... [X]
       return this;  
   }
};
class C : virtual public B{
   public: using B::get;
   public: template<class T> T* get() requires std::is_same_v< T, C>{ //... [Y]
       return this;
   }
};
int main(){
   C c;
   B* b1=c.get<B>();
   C* c1=c.get<C>();
   B* b2=c.get<B>();
}

cppreference ,即使我使用using B::get

如果派生类已经有一个具有相同名称参数列表限定条件的成员 (Y),则派生类成员隐藏或覆盖(不冲突)从基类引入的成员 (X)。

我试图消化这句话。

请确认这 3 个陈述。

  • [X]&[Y] 具有相同的名称参数列表
  • 但是 [X] 和 [Y] 的资格是不同的。
  • 因此,不会发生隐藏或覆盖。

他们都正确吗?
如果是这样,我将依靠这种令人敬畏的行为。

这是在namespace.udecl#14中指定的,强调我的,

当 using-declarator 将基类中的声明带入派生类时,派生类中的成员函数和成员函数模板会覆盖和/或隐藏同名的成员函数和成员函数模板,参数类型列表([dcl .fct]),尾随 requires-clause(如果有) 、cv-qualification 和 ref-qualifier(如果有),在基类中(而不是冲突)。 此类隐藏或覆盖的声明被排除在 using-declarator 引入的声明集中。

至于你的问题,

  • [X]&[Y] 具有相同的名称和参数列表。
  • 但是 [X] 和 [Y] 的资格是不同的。
  • 因此,不会发生隐藏或覆盖。

是的,[X] 和 [Y] 完全相同,除了结尾的 requires 子句。 因此,不会出现隐藏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM