gpt4 book ai didi

c++ - SFINAE : Derived class hide base class function depend on T

转载 作者:行者123 更新时间:2023-11-30 01:35:15 24 4
gpt4 key购买 nike

我编码了 2 个 SFINAE 片段。
他们做的事情完全一样。
但是,第一个有效,而第二个无效。
为什么? (第二个更接近我的真实程序。)

此代码有效(http://coliru.stacked-crooked.com/a/50e07af54708f076)

#include <iostream>
#include <type_traits>
enum EN{ EN1,EN2 };
template<EN T1> class B{
public: template<EN enLocal=T1> typename
std::enable_if<enLocal==EN1,void>::type test(){ std::cout<<"1"<<std::endl;}
public: template<EN enLocal=T1> typename
std::enable_if<enLocal==EN2,void>::type test(){ std::cout<<"2"<<std::endl; }
};

int main(){
B<EN1> b;
b.test();
}

但是这段代码是不可编译的(http://coliru.stacked-crooked.com/a/28b6afd443b36c7e):-

#include <iostream>
#include <type_traits>
enum EN{ EN1,EN2 };
class Base{
public: void test(){
std::cout<<"1"<<std::endl;
};
};
template<EN T1> class B : public Base{
public: template<EN enLocal=T1>
std::enable_if_t< enLocal==EN2,void > test(){
std::cout<<"2"<<std::endl;
}
};
int main(){
B<EN1> bEn1; bEn1.test(); //should print 1
//B<EN2> bEn2; bEn2.test(); //print 2
}

我对 SFINAE 很陌生,仍在通过 https://stackoverflow.com/a/50562202/ 学习它.

最佳答案

这段代码有两个问题:

  1. 调用时 bEn1.test();bEn2.test();编译器会找出那个名字 test引用类B中的函数并且重载函数集将仅包括 B::test .这可以通过将基类中的名称引入派生类来解决:
template<EN T1> class B : public Base{
public: using Base::test;
  1. 但是现在非模板函数将优先于模板函数(即使 enable_if 有效)所以 B<EN2> bEn2; bEn2.test();将打印 1。

为了使这项工作再次起作用,您可以引入另一个类似于第一个示例中的重载,它将从基类调用函数而不是引入 Base::test。名称到派生类:

public: template<EN enLocal=T1> 
std::enable_if_t< enLocal!=EN2,void > test(){
return Base::test();
}

利用 if constexpr 的另一种可能的 C++17 风格解决方法而不是类型特征或 SFINAE:

public: template<EN enLocal = T1> void
test()
{
if constexpr(EN2 == enLocal)
{
std::cout<<"2"<<std::endl;
}
else
{
Base::test();
}
}

关于c++ - SFINAE : Derived class hide base class function depend on T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54549440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com