Skip to content

Use a manual vtable, not C++ virtual functions #2

@jbcoe

Description

@jbcoe
struct interfaceA {
  void * object;
  struct vtable_t { 
    std::string_view (*name)(const void *);
    int (*count)(void *);
  };
  const vtable_t * vtable_ptr;
  template <typename T> static constexpr auto vtable_for = vtable_t { 
    .name = [](const void * obj) { return static_cast<const T*>(obj)->name(); },
    .count = [](void * obj) { return static_cast<T*>(obj)->count(); }
  };

  template <typename T> interfaceA(T & obj): object{&obj}, vtable_ptr{&vtable_for<T>} { }
  std::string_view name() const {
    return vtable_ptr->name(object);
  }
  int count() {
    return vtable_ptr->count(object);
  }
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions