Ray*_*yer 4 c++ templates forwarding c++11
class Foo {
public:
  void methodA();
};
class ManagedFoo {
Foo fooInst;
public:
  void methodA() { doSomething(); fooInst.methodA();}
};
现在我想将ManagedFoo作为模板,不仅管理任何类Foo,而且在调用任何Foo函数之前,首先调用doSomething.
template<typename _TyManaged>
class Manager {
  _TyManaged _managedInst;
  void doSomething();
public:
  /*Forward every function called by _managedInst*/
  /*How to write this?*/
};
我想让它变得一样,让它在这两个类之间可以替换,如下所示:
Foo* foo = new Foo();
foo->methodA();
Manager<Foo> managedFoo = new Manager<Foo>();
managedFoo->methodA(); //Hope it call Manager::doSomething() first then call _managedInst.methodA();
C++ 11模板可以做这样的事吗?如果答案是肯定的,怎么办?
基于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
}
| 归档时间: | 
 | 
| 查看次数: | 246 次 | 
| 最近记录: |