fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. template <typename T>
  7. class Base {
  8. public:
  9. Base(const T& t) : _t(t) {}
  10. virtual ~Base() { }
  11.  
  12. void doSomething() { cout << "Hello world\n"; }
  13.  
  14. virtual T getVal() const { return _t; }
  15.  
  16. private:
  17. T _t;
  18. };
  19.  
  20. class DerivedA : public virtual Base<string>
  21. {
  22. public:
  23. DerivedA(const string& path) : Base<string>(path) {}
  24. virtual ~DerivedA() {}
  25. };
  26.  
  27. namespace details {
  28. template<typename T>
  29. Base<T>* make_base(Base<T>* param) { return param; }
  30. }
  31.  
  32. template<typename T>
  33. auto make_base(T& param) -> decltype(details::make_base(&param)) { return details::make_base(&param); }
  34.  
  35. int main() {
  36. DerivedA foo("foo"s);
  37. auto bar = make_base(foo);
  38.  
  39. bar->doSomething();
  40. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Hello world