/* Copyright 2024 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See http://www.boost.org/libs/poly_collection for library home page. */ /* basic usage of boost::variant_collection */ #include #include #include "rolegame.hpp" template struct overloaded:Ts...{using Ts::operator()...;}; template overloaded(Ts...)->overloaded; int main() { //[basic_variant_1 //= #include //= ... //= boost::variant_collection< boost::mp11::mp_list > c; //] { //[basic_variant_2 boost::variant_collection_of< warrior,juggernaut,goblin,elf,std::string,window > c; //] } // populate with sprites std::mt19937 gen{92754}; // some arbitrary random seed std::discrete_distribution<> rnd{{1,1,1,1}}; for(int i=0;i<5;++i){ // assign each type with 1/4 probability switch(rnd(gen)){ case 0: c.insert(warrior{i});break; case 1: c.insert(juggernaut{i});break; case 2: c.insert(goblin{i});break; case 3: c.insert(elf{i});break; } } // populate with messages c.insert(std::string{"\"stamina: 10,000\""}); c.insert(std::string{"\"game over\""}); // populate with windows c.insert(window{"pop-up 1"}); c.insert(window{"pop-up 2"}); { //[basic_variant_3 //= // usual utility to construct a visitor //= template //= struct overloaded:Ts...{using Ts::operator()...;}; //= template //= overloaded(Ts...)->overloaded; const char* comma=""; for(const auto& r:c){ std::cout<