调整模板提供的基类

PSk*_*cik 6 c++ c++11

如果基类没有提供方法,你将如何填写方法?如果提供的话,我想重用基类方法.

例如:

#include <iostream>
struct Base0 { };
struct Base1 { void m() { std::cout<<"Base1\n"; } };

template<typename T>
struct Derived : public T {
  //if T doesn't provide m, define it here, otherwise reuse the base class method 
  void m(){ /*? std::cout<<"Derived\n"; ?*/ }
};

int main(){
  Derived<Base0> d0;
  d0.m(); //should print "Derived"
  Derived<Base1> d1;
  d1.m(); //should print "Base1"
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 8

有了SFINAE,你可以这样做

template<typename T>
struct Derived : public T {
private:
  template <typename U = T>
  auto m_impl(int) -> decltype(std::declval<U&>().m()){ this->U::m(); }

  template <typename U = T>
  void m_impl(... ) { std::cout<<"Derived\n"; }

public:
  void m() { m_impl(0); }
};
Run Code Online (Sandbox Code Playgroud)

演示