是否可以从父类"转发任何类函数"的C++模板?

Ray*_*yer 4 c++ templates forwarding c++11

class Foo {
public:
  void methodA();
};

class ManagedFoo {
Foo fooInst;
public:
  void methodA() { doSomething(); fooInst.methodA();}
};
Run Code Online (Sandbox Code Playgroud)

现在我想将ManagedFoo作为模板,不仅管理任何类Foo,而且在调用任何Foo函数之前,首先调用doSomething.

template<typename _TyManaged>
class Manager {
  _TyManaged _managedInst;
  void doSomething();
public:
  /*Forward every function called by _managedInst*/
  /*How to write this?*/
};
Run Code Online (Sandbox Code Playgroud)

我想让它变得一样,让它在这两个类之间可以替换,如下所示:

Foo* foo = new Foo();
foo->methodA();

Manager<Foo> managedFoo = new Manager<Foo>();
managedFoo->methodA(); //Hope it call Manager::doSomething() first then call _managedInst.methodA();
Run Code Online (Sandbox Code Playgroud)

C++ 11模板可以做这样的事吗?如果答案是肯定的,怎么办?

Ale*_*lov 6

基于operator->重载的解决方案:

#include <iostream>
#include <memory>

class A {
public:
    void foo() { std::cout << "foo\n"; }
    void bar() { std::cout << "bar\n"; }
};

template <typename T>
class ManagedBase {
    std::shared_ptr<T> _inst;
public:
    ManagedBase(const std::shared_ptr<T> inst) : _inst(inst) { }
    virtual ~ManagedBase() { }

    std::shared_ptr<T> operator->() {
        before();
        return this->_inst;
    }

    virtual void before() =0;
};


template <typename T>
class ManagedPrint : public ManagedBase<T> {
public:
    ManagedPrint(const std::shared_ptr<T> inst) : ManagedBase(inst) { }

    virtual void before() {
        std::cout << "Said: ";
    }
};


int main() {
    auto ma = ManagedPrint<A>(std::make_shared<A>());
    ma->bar();      // Said: foo
    ma->bar();      // Said: bar
}
Run Code Online (Sandbox Code Playgroud)