Nowa funkcja
std::visit w C++17 umożliwia wywołanie funkcji na rzecz jakiegoś obiektu. Mając wiele takich obiektów (np. "odwiedzając" w pętli obiekty zachowane w jakimś kontenerze) mamy gotowy wzorzec
wizytator (odwiedzający). Typowym sposobem implementacji takiego wzorca w C++ było skorzystanie z polimorfizmu.
std::visit pozwala jednak na wywołanie funkcji na dowolnym obiekcie. Klasy nie muszą mieć wspólnego interfejsu, ale trzeba będzie skorzystać z znanego
z biblioteki boost std::variant. W ten sposób można przechowywać obiekty alternatywnych typów (
type-safe union).
#include <iostream>
#include <vector>
#include <variant>
using namespace std;
struct Circle {
void show() const { cout << "Circle" << endl; }
};
struct Rect {
void show() const { cout << "Rect" << endl; }
};
int main() {
using Variant = std::variant<Circle, Rect>;
vector<Variant> vec;
vec.push_back(Circle{});
vec.push_back(Rect{});
for (const auto& v : vec) {
std::visit([](const auto& obj){ obj.show(); }, v);
}
}
Wynik:
Circle
Rect
Brak komentarzy:
Prześlij komentarz