C ++该代码如何工作(enable_if构造函数/方法)?

时间:2019-11-21 02:17:37

标签: c++ sfinae enable-if

我知道之前已经讨论过这两个主题,但是对于启用构造函数和方法启用的方式仍然不清楚。

这是我创建的一个很好的清晰示例。

#include <type_traits>
#include <string>
#include <iostream>



template<bool B> using EnableConstructorIf = typename std::enable_if<B, int>::type;

template<bool B, class T> using EnableMethodIf = typename std::enable_if<B,T>::type;


template <int N>
class MyClass {
public:
  std::string s;


  template<int M=N, EnableConstructorIf< (M<0) > = 0> MyClass() {
    s = "Negative";
  }
  template<int M=N, EnableConstructorIf< (M==0) > = 0> MyClass() {
    s = "Zero";
  }
  template<int M=N, EnableConstructorIf< (M>0) > = 0 > MyClass() {
    s = "Positive";
  }

  template<int M=N> EnableMethodIf< (M<0),  int> getSign() {
    return -1;
  }
  template<int M=N> EnableMethodIf< (M==0), int> getSign() {
    return 0;
  }
  template<int M=N> EnableMethodIf< (M>0),  int> getSign() {
    return +1;
  }


};



int main(int argc, char *argv[])
{
  using namespace std;

  MyClass<-5> a;
  MyClass<0> b;
  MyClass<100> c;

  cout << "a.string = " << a.s <<" ->"<< a.getSign() << endl;
  cout << "b.string = " << b.s <<" ->"<< b.getSign() << endl;
  cout << "c.string = " << c.s <<" ->"<< c.getSign() << endl;


  return 0;
}

它按预期编译并产生以下输出。但是如何运作?

a.string = Negative ->-1
b.string = Zero ->0
c.string = Positive ->1

0 个答案:

没有答案