A wrapper around std::variant with some helper functions
#include <ea_variant/ea_variant.h>
#include <iostream>
#include <vector>
struct First
{
void process() const
{
std::cout << "I am first! My value is " << myValue << std::endl;
}
int myValue = 5;
};
struct Second
{
void process() const
{
std::cout << "I am second! My value is " << text << std::endl;
}
std::string text = "Hello World";
};
int main()
{
using Var = EA::Variant<First, Second>;
std::vector<Var> container;
container.emplace_back(First());
container.emplace_back(First());
container.emplace_back(Second());
//Visit polymorphic call:
for (auto& element: container)
element.visit([](auto& obj) { obj.process(); });
//Manual polymorphic call:
for (auto& element: container)
{
if (auto* first = element.get<First>())
first->process();
else if (auto* second = element.get<Second>())
second->process();
}
return 0;
}
I created this for a few reasons:
- std::visit has some issues in some compilers.
- A faster alternative, like rollbear::visit doesn't compile on MacOS
- I wanted to wrap this in a JUCE-style module
- I thought the syntax could be slightly simplified by wrapping in an object
How to use:
Include the ea_variant.h
file.
you can also use CMake to set up the include directories automatically
Visitation is using a modified version of: https://github.com/rollbear/visit