Compare commits

...

5 commits

View file

@ -96,22 +96,22 @@ For example, a dummy file-system interface might look like the following:
```cpp
struct Filesystem {
virtual void write(std::string_view filename, std::span<char> data) = 0;
virtual std::vector read(std::string_view filename) = 0;
virtual std::vector<char> read(std::string_view filename) = 0;
virtual void delete(std::string_view filename) = 0;
};
```
You can then write `PosixFilesystem` which makes use of the POSIX API and
interact with actual on-disk data, `MockFilesystem` which only works in-memory
and can be used for tests only, etc...
and can be used for testing, etc...
## Double dispatch
## Double dispatch through the Visitor pattern
Sometimes single dispatch is not enough, such as in the collision example at
the beginning of this article. In cases where a computation depends on the
dynamic type of *two* of its values, we can make use of double-dispatch by
calling a virtual method on the first value, which will call a virtual method
on the second value.
Sometimes single dispatch is not enough, such as in the collision example at the
beginning of this article. In cases where a computation depends on the dynamic
type of *two* of its values, we can make use of double-dispatch by leveraging
the Visitor design pattern. This is done by calling a virtual method on the
first value, which itself will call a virtual method on the second value.
Here's a commentated example:
@ -161,8 +161,8 @@ void collide(SpaceObject& first, SpaceObject& second) {
};
int main() {
std::unique_ptr<SpaceObject> asteroid = std::make_unique<Asteroid>();
std::unique_ptr<SpaceObject> spaceship = std::make_unique<Spaceship>();
auto asteroid = std::make_unique<Asteroid>();
auto spaceship = std::make_unique<Spaceship>();
collide(*asteroid, *spaceship);
// Calls in order: