No virtual method "any" example

From Adobe Open Source Wiki
Revision as of 06:13, 15 January 2013 by SeanParent (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
struct concept_t;

struct vtable_t {
    void (*destruct)(const concept_t&);
    concept_t* (*copy)(const concept_t&);
    void (*print)(const concept_t&);
};

struct concept_t {
    explicit concept_t(const vtable_t& x) : vtable_(&x) { }
    
    void destruct() const { vtable_->destruct(*this); }
    concept_t* copy() const { return vtable_->copy(*this); }
    void print() const { vtable_->print(*this); }

    const vtable_t* vtable_;
};

template <typename T>
struct model : concept_t {
    explicit model(T& x) : concept_t(vtable_), data_(move(x)) { }
    static void destruct(const concept_t& x) { static_cast<const model&>(x).~model(); }
    static concept_t* copy(const concept_t& x) { return new model(static_cast<const model&>(x)); }
    static void print(const concept_t& x) { cout << static_cast<const model&>(x).data_ << endl; }
    
    static const vtable_t vtable_;
    
    T data_;
};

template <typename T>
const vtable_t model<T>::vtable_ = {
    &model::destruct,
    &model::copy,
    &model::print
};

class any {
public:
    template <typename T>
    any(T x) : object_(new model<T>(x)) { }
    ~any() { object_->destruct(); operator delete(static_cast<void*>(object_)); }
    any(const any& x) : object_(x.object_->copy()) { }
    
    friend inline void swap(any& x, any& y) { std::swap(x.object_, y.object_); }
    any& operator=(const any& x) { any tmp(x); swap(*this, tmp); return *this; }
    
    friend inline void print(const any& x) { x.object_->print(); }
private:
    concept_t* object_;
};