38 Animal(
const std::string &_name,
Kind _kind) : kind(_kind), name(_name) {}
44 std::string sound =
"WOOF!";
48 explicit Labrador(
const std::string &_name,
int _excitement = 9001)
55 sound =
"iyiyiyiyiyi";
57 std::string
bark()
const {
return Dog::bark() +
" and runs in circles"; }
62 std::string
purr()
const {
return "mrowr"; }
67 std::string
purr()
const {
return "mrrrRRRRRR"; }
71 std::vector<std::unique_ptr<Animal>>
ret;
72 ret.emplace_back(
new Labrador(
"Fido", 15000));
79 ret.emplace_back(
new Chihuahua(
"Hertzl"));
81 ret.emplace_back(
new Panther(
"Leo"));
121 template <
typename itype>
123 static const void *
get(
const itype *src,
const std::type_info *&
type) {
131 py::class_<Animal>(
m,
"Animal").def_readonly(
"name", &
Animal::name);
132 py::class_<Dog, Animal>(
m,
"Dog")
133 .def(py::init<std::string>())
136 py::class_<Labrador, Dog>(
m,
"Labrador")
137 .def(py::init<std::string, int>(),
"name"_a,
"excitement"_a = 9001)
139 py::class_<Chihuahua, Dog>(
m,
"Chihuahua")
140 .def(py::init<std::string>())
142 py::class_<Cat, Animal>(
m,
"Cat").def(py::init<std::string>()).def(
"purr", &
Cat::purr);
143 py::class_<Panther, Cat>(
m,
"Panther")
144 .def(py::init<std::string>())
std::vector< std::unique_ptr< Animal > > create_zoo()
Panther(const std::string &_name)
Animal(const std::string &_name, Kind _kind)
TEST_SUBMODULE(tagbased_polymorphic, m)
PYBIND11_NOINLINE void clean_type_id(std::string &name)
static const std::type_info * type_of_kind(Kind kind)
Dog(const std::string &_name, Kind _kind=Kind::Dog)
static std::string name_of_kind(Kind kind)
Chihuahua(const std::string &_name)
typename std::enable_if< B, T >::type enable_if_t
from cpp_future import (convenient aliases from C++14/17)
Annotation for function names.
virtual ~Animal()=default
Cat(const std::string &_name, Kind _kind=Kind::Cat)
Labrador(const std::string &_name, int _excitement=9001)