かなり強引に。
#include <memory> class wrap_base { struct holder_base { virtual void execute() = 0; }; template<typename T> struct holder : public holder_base { T& instance; holder(T& value) : instance(value) {} void execute() { instance.execute(); } }; std::auto_ptr<holder_base> obj_; public: template<typename T> wrap_base(T& obj) : obj_(new holder<T>(obj)) {} template<typename T> wrap_base& operator=(T& obj) { obj_.reset(new holder<T>(obj)); return *this; } void execute() { obj_->execute(); } }; void main() { // hoge, foo の実装は先の例と同じもの hoge h; foo f; wrap_base b = h; b.execute(); b = f; b.execute(); }一応動かすことはできましたが、 holder に使用したいメソッドが追加されるたびに変更が入ってしまうなど問題が多すぎて実用性は皆無ですね。これなら先ほどの、関数ひとつかませるやり方のほうがまだスマートな気がします。道は険しい……。